00:00:00
Avalonia ContentControl 内容切换
纯记录。
使用 ContentControl 来根据不同的值来切换对应的内容。
使用控制数据模板 IDataTemplate 来实现。
首先,新建一个 IDataTemplate 。IDataTemplate 需要实现 Build 方法 和 Match 方法
csharp
public class ShapesTemplateSelector : IDataTemplate
{
[Content]
public Dictionary<string, IDataTemplate> AvailableTemplates { get; set; } = new();
public Control? Build(object? param)
{
var key = param?.ToString();
if (key is null)
{
throw new ArgumentNullException(nameof(param));
}
return AvailableTemplates[key].Build(param);
}
public bool Match(object? data)
{
var key = data?.ToString();
return data is Enum
&& !string.IsNullOrEmpty(key)
&& AvailableTemplates.ContainsKey(key);
}
}其中 AvailableTemplates 就是把你给的值和 axaml 里的 Window.DataTemplates 的 DataTemplate,一一存到字典里。这里用的是 Enum ,复杂的类型需要自己改了。
axaml 页面,引入在上面的方法命名空间 xmlns:helper="using:AvaloniaApplication1.Helper"
xml
<Window.DataTemplates>
<helper:ShapesTemplateSelector>
<DataTemplate x:Key="ContentIsNull">
<Ellipse Width="50"
Height="50"
Fill="Red"
Stroke="DarkRed"
StrokeThickness="2" />
</DataTemplate>
<DataTemplate x:Key="ContentReplace" >
<Ellipse Width="50"
Height="50"
Fill="Gold"
Stroke="DarkRed"
StrokeThickness="2" />
</DataTemplate>
<DataTemplate x:Key="HtmlReplace">
<Ellipse Width="50"
Height="50"
Fill="Red"
Stroke="DarkRed"
StrokeThickness="2" />
</DataTemplate>
<DataTemplate x:Key="SimplifiedToTraditional">
<Ellipse Width="50"
Height="50"
Fill="Green"
Stroke="DarkRed"
StrokeThickness="2" />
</DataTemplate>
</helper:ShapesTemplateSelector>
</Window.DataTemplates>
<ComboBox Grid.Row="1" ItemsSource="{Binding AvailableShapes}"
SelectedIndex="0"
SelectedItem="{Binding SelectedShape}" />
<ContentControl Grid.Row="2"
Content="{Binding SelectedShape}"
/>ViewModel
csharp
[ObservableProperty]
private Enum _selectedShape;
public FilterType[] AvailableShapes { get; } = Enum.GetValues<FilterType>();enum FilterType
csharp
public enum FilterType
{
[Description("内容为空")]
ContentIsNull,
[Description("内容替换")]
ContentReplace,
[Description("Html过滤")]
HtmlReplace,
[Description("正则替换")]
RegReplace,
}这样就 ComboBox 选哪个,ContentControl 也会跟着变。ComboBox 只是示例,也可以使用按钮 或者类似 MenuFlyout 这种。
注意这里全局的如果是控件支持的话,控件本身也会变成 DataTemplate 的样式,ComboBox 就是匹配到了,然后 ComboBox 下拉框各种颜色的圈圈。
可以改成内部样式,这样 ContentControl 独享或者其他指定绑定方式,自己问 deepseek 吧。
xml
<ContentControl.DataTemplates>
<helper:ShapesTemplateSelector>
<DataTemplate x:Key="ContentIsNull">
...
</DataTemplate>
<DataTemplate x:Key="ContentReplace" >
...
</DataTemplate>
</helper:ShapesTemplateSelector>
</ContentControl.DataTemplates>
</ContentControl>