如何使用 AvalonDock 为 XAML 文件中的 LayoutAnchorableItem 绑定样式 属性?
How to bind Style property for LayoutAnchorableItem in XAML file with AvalonDock?
我在我的项目中创建了一个 avalon 停靠界面,我想与 LayoutAnchorableItem 属性 "Visibility" 交互,但是如何将它实现到我的 XAML 代码中?我的 DockingManager.LayoutItemContainerStyle 分支中不能有两个 Style 定义...
我要添加的行:
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />
我原来的XAML代码:
<dock:DockingManager DataContext="{Binding DockManagerViewModel}" DocumentsSource="{Binding Documents}" AnchorablesSource="{Binding Anchorables}" >
<dock:DockingManager.Resources>
<!-- add views for specific ViewModels -->
<DataTemplate DataType="{x:Type vmdock:SampleDockWindowViewModel}">
<uscontrol:SampleDockWindowView />
</DataTemplate>
</dock:DockingManager.Resources>
<dock:DockingManager.LayoutItemContainerStyle>
<!--you can add additional bindings from the layoutitem to the DockWindowViewModel-->
<Style TargetType="{x:Type dockctrl:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Title}" />
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose}" />
<Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
</Style>
</dock:DockingManager.LayoutItemContainerStyle>
非常感谢!
如果你想 select 多个样式之间有一个 LayoutItemContainerStyleSelector property on the dockingmanager which uses a Style Selector。
使用此样式 select或者您可以根据对象是 LayoutAnchorableItem 还是不同类型的 LayoutItem 选择要应用的样式。
public class MyStyleSelector : StyleSelector
{
public Style DefaultStyle { get; set; }
public Style CustomStyle { get; set; }
public override Style SelectStyle(object item, DependencyObject container)
{
if (item is LayoutAnchorableItem)
{
return CustomStyle;
}
return DefaultStyle;
}
}
如果您想将单一样式 setter 合并到其他样式,您可以使用 BasedOn 属性。这是有效的,因为 LayoutAnchorableItem 继承了 LayoutItem。有了这个,您可以根据另一种样式制作样式,以便它继承所有 setters。资源看起来像:
<Style TargetType="{x:Type dockctrl:LayoutItem}" x:Key="DefaultStyle">
<Setter Property="Title" Value="{Binding Model.Title}" />
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose}" />
<Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
</Style>
<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}" BasedOn="{StaticResource DefaultStyle}" x:Key="CustomStyle">
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />
</Style>
<local:MyStyleSelector DefaultStyle="{StaticResource DefaultStyle}" CustomStyle="{StaticResource CustomStyle}" x:Key="MyStyleSelector" />
现在您可以使用新样式填写对接管理器select或.
<dock:DockingManager LayoutItemContainerStyleSelector="{StaticResource MyStyleSelector}" ...
您可以省略样式 select或删除资源中的键。请注意,这些样式随后将应用于所有子项,这不是您通常想要的。
感谢您的回答!
我不确定它能解决我的问题……我想要的是为其他目标类型定义样式,就像我可以写:
<Style TargetType="{x:Type dockctrl:LayoutItem}">
[...]
</Style>
<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}">
[...]
</Style>
但我无法将这两种样式直接写入我的 DockingManager.LayoutItemContainerStyle 分支。它只接受一个 Style 定义......如何处理?谢谢
我在我的项目中创建了一个 avalon 停靠界面,我想与 LayoutAnchorableItem 属性 "Visibility" 交互,但是如何将它实现到我的 XAML 代码中?我的 DockingManager.LayoutItemContainerStyle 分支中不能有两个 Style 定义...
我要添加的行:
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />
我原来的XAML代码:
<dock:DockingManager DataContext="{Binding DockManagerViewModel}" DocumentsSource="{Binding Documents}" AnchorablesSource="{Binding Anchorables}" >
<dock:DockingManager.Resources>
<!-- add views for specific ViewModels -->
<DataTemplate DataType="{x:Type vmdock:SampleDockWindowViewModel}">
<uscontrol:SampleDockWindowView />
</DataTemplate>
</dock:DockingManager.Resources>
<dock:DockingManager.LayoutItemContainerStyle>
<!--you can add additional bindings from the layoutitem to the DockWindowViewModel-->
<Style TargetType="{x:Type dockctrl:LayoutItem}">
<Setter Property="Title" Value="{Binding Model.Title}" />
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose}" />
<Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
</Style>
</dock:DockingManager.LayoutItemContainerStyle>
非常感谢!
如果你想 select 多个样式之间有一个 LayoutItemContainerStyleSelector property on the dockingmanager which uses a Style Selector。 使用此样式 select或者您可以根据对象是 LayoutAnchorableItem 还是不同类型的 LayoutItem 选择要应用的样式。
public class MyStyleSelector : StyleSelector
{
public Style DefaultStyle { get; set; }
public Style CustomStyle { get; set; }
public override Style SelectStyle(object item, DependencyObject container)
{
if (item is LayoutAnchorableItem)
{
return CustomStyle;
}
return DefaultStyle;
}
}
如果您想将单一样式 setter 合并到其他样式,您可以使用 BasedOn 属性。这是有效的,因为 LayoutAnchorableItem 继承了 LayoutItem。有了这个,您可以根据另一种样式制作样式,以便它继承所有 setters。资源看起来像:
<Style TargetType="{x:Type dockctrl:LayoutItem}" x:Key="DefaultStyle">
<Setter Property="Title" Value="{Binding Model.Title}" />
<Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
<Setter Property="CanClose" Value="{Binding Model.CanClose}" />
<Setter Property="IsSelected" Value="{Binding Model.IsSelected}" />
</Style>
<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}" BasedOn="{StaticResource DefaultStyle}" x:Key="CustomStyle">
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}" />
</Style>
<local:MyStyleSelector DefaultStyle="{StaticResource DefaultStyle}" CustomStyle="{StaticResource CustomStyle}" x:Key="MyStyleSelector" />
现在您可以使用新样式填写对接管理器select或.
<dock:DockingManager LayoutItemContainerStyleSelector="{StaticResource MyStyleSelector}" ...
您可以省略样式 select或删除资源中的键。请注意,这些样式随后将应用于所有子项,这不是您通常想要的。
感谢您的回答! 我不确定它能解决我的问题……我想要的是为其他目标类型定义样式,就像我可以写:
<Style TargetType="{x:Type dockctrl:LayoutItem}">
[...]
</Style>
<Style TargetType="{x:Type dockctrl:LayoutAnchorableItem}">
[...]
</Style>
但我无法将这两种样式直接写入我的 DockingManager.LayoutItemContainerStyle 分支。它只接受一个 Style 定义......如何处理?谢谢