我有一个用户控件,我想在其他项目中使用它。当我直接给它的属性设置一些值时,没有问题:
<local:MyUserControl prop1="val1" prop2="val2">
    ...
</local:MyUserControl>但我不能将样式应用于它。我试过了:
<Window ...>
    <Window.Resources>
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type local:MyUserControl}">
            <Setter Property="prop1" Value="val1"/>
            <Setter Property="prop2" Value="val2"/>
        </Style>
    </Window.Resources>
    <Grid>
        <local:MyUserControl Style="{StaticResource ResourceKey=MyUserControlStyle}">
            ...
        </local:MyUserControl>
    </Grid>
</Window>我哪里错了?-Thanks
发布于 2011-09-21 13:39:03
根据亲爱的@Mario Vernari的说明,我发现这个问题是由于我用来创建UserControl的一个糟糕的策略造成的。我想创建一个UserControl,能够容纳一些其他的。所以我试了一下:
<UserControl x:Class="MyNamespace.MyUserControl"
             ...
             Style="{DynamicResource ResourceKey=MyUserControlStyle}">
    <UserControl.Resources>
        ...
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type UserControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type UserControl}">
                        <Border BorderBrush="{Binding Path=DP1}">
                            ...
                            <ContentPresenter ... Content="{TemplateBinding Content}"/>
                            ...
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
</UserControl>其中,DP1是Brush类型的依赖属性。如果您直接设置它的属性(如DP1),那么通过这种方式创建的UserControl就可以工作。正如@Mario告诉我的那样,这绝对不是真正的方式:
...When你使用了一个UserControl,这意味着你已经知道了它的布局,不需要进一步设置控件的样式。您同时定义了它的样式两次,因此导致冲突...
他还补充道:
相反,您应该使用CustomControl;在Themes文件夹中定义默认样式(如果您拥有常规的Visual Studio,它会自动生成)。之后,您可以在自己的应用程序中覆盖默认样式。以同样的方式处理普通基类及其派生类。
遵循这个:http://www.codeproject.com/KB/WPF/WPFCustomControl.aspx ...
显然,在这种情况下,我们需要从ContentControl类(而不是Control类)派生无外观控件。你可以看看this & this来掌握细节。
在这里,我再次感谢@Mario。;)
https://stackoverflow.com/questions/7470621
复制相似问题