Wpf 不使用自定义ListView的样式
我有一个程序集,在其中定义了几个具有自己样式的自定义控件(基于现有控件) 对于所有这些,我定义了静态构造函数,在其中设置DefaultStyleKeyProperty并将样式XAML文件添加到Themes/Generic.XAML 除了我的自定义ListView之外,它对所有用户都正常工作。。这快把我逼疯了 以下是一个简短的示例:Wpf 不使用自定义ListView的样式,wpf,xaml,custom-controls,Wpf,Xaml,Custom Controls,我有一个程序集,在其中定义了几个具有自己样式的自定义控件(基于现有控件) 对于所有这些,我定义了静态构造函数,在其中设置DefaultStyleKeyProperty并将样式XAML文件添加到Themes/Generic.XAML 除了我的自定义ListView之外,它对所有用户都正常工作。。这快把我逼疯了 以下是一个简短的示例: public class EmListView : ListView { /// <summary> /// Constructor
public class EmListView : ListView
{
/// <summary>
/// Constructor
/// </summary>
static EmListView()
{
// Set the default style type
DefaultStyleKeyProperty.OverrideMetadata(typeof(EmListView), new FrameworkPropertyMetadata(typeof(EmListView)));
}
}
公共类EmListView:ListView
{
///
///建造师
///
静态EmListView()
{
//设置默认样式类型
DefaultStyleKeyProperty.OverrideMetadata(typeof(EmListView),new FrameworkPropertyMetadata(typeof(EmListView));
}
}
Generic.XAML中声明的XAML文件:
<Style TargetType="{x:Type ui:EmListView}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ui:EmListView}">
<Border Name="Border" Style="{DynamicResource EMLV_ListViewBorderStyle}" Margin="50">
<ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
<ItemsPresenter />
</ScrollViewer>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.3" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我不知道为什么,但在EmListView上应用我的样式的唯一方法是在使用它时强制使用样式,如:
<ui:EmListView Margin="5" Style="{DynamicResource {x:Type ui:EmListView}}">
我有EmWindow,EmButton。。除该ListView外,其他所有视图都将自动应用样式。ListView有什么特别之处吗
多谢各位
编辑:
我发现了一些东西,似乎是我的EmListView声明引起了麻烦
以下是窗口内的示例声明:
<ui:EmListView Margin="5">
<ui:EmListView.View>
<GridView>
<ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" />
<ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" />
<ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" />
<ui:EmSortableGridViewColumn Width="100" DisplayMemberBinding="{Binding artCode, Mode=OneWay}" SortPropertyName="artCode" Header="Code" IsDefaultSortColumn="True" />
</GridView>
</ui:EmListView.View>
</ui:EmListView>
该样式不适用,它不断向我发出警告,表示它无法在样式中定义OverridesDefaultStyle属性
如果我只是这样声明:
<ui:EmListView Margin="5" />
我没有警告,我的样式设置正确。我解决了我的问题,我在EmListView构造函数中做了一个糟糕的变通方法,如下所示:
public EmListView()
{
Style defaultStyle = (Style)Application.Current.TryFindResource(typeof(EmListView));
if (defaultStyle != null)
{
this.OverridesDefaultStyle = true;
this.Style = defaultStyle;
}
}
如果有人能告诉我为什么我必须只为我的自定义ListView控件做这个把戏,我很乐意知道