我对WPF很陌生,我想创建一个基本的UserControl,这是可重用的。
例如,我有这个UserControl:测试库
<UserControl x:Class="UserControls.TestBase"
xmlns=""
xmlns:x=""
xmlns:mc=""
xmlns:d=""
xmlns:local="clr-namespace:UserControls"
mc:Ignorable="d"
Style="{StaticResource TestBaseDefault}"
d:DesignHeight="150" d:DesignWidth="150">
<UserControl.Template>
<ControlTemplate>
<Grid>
<TextBlock Text="Base Text"
HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="White"/>
</Grid>
</ControlTemplate>
</UserControl.Template>
</UserControl>
UserControlTestBase正在使用此样式(TestBaseDefault):
<Style x:Key="TestBaseDefault" TargetType="{x:Type UserControl}">
<Setter Property="Margin" Value="5"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type UserControl}">
<Border CornerRadius="10" BorderThickness="2" BorderBrush="{StaticResource ForegroundBrush}" Background="{StaticResource BackgroundBrush}" Padding="10">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在我想创建第二个UserControl,它扩展自TestBase。
它看起来像这样:测试1
<UserControl x:Class="UserControls.Test1"
xmlns=""
xmlns:x=""
xmlns:mc=""
xmlns:d=""
xmlns:local="clr-namespace:UserControls"
x:Name="self"
mc:Ignorable="d"
d:DesignHeight="150" d:DesignWidth="150">
<Grid>
<TextBlock Text="Overriden Text"
HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="White"/>
</Grid>
</UserControl>
- 不得不从UserControls中删除链接,否则我无法发布问题。*
我想知道的是,有没有可能从TestBase而不是UserControl扩展Test1,这样我就可以从Base访问属性,使用其中的Style并覆盖默认内容?
如果没有,是否有其他方法可以实现?
2条答案
按热度按时间lkaoscv71#
由于所有内容都与问题中的样式有关(与该控件有关),因此您应该定义基础控件的默认样式并设置文本属性(无论您想要什么)。你不需要创建一个c#基类控件类,除非你因为某些需求而显式地需要它。
如果你想使用或覆盖基本控件的样式,只需在定义它时使用它:
基本风格是:
对于第二个控件,使用以下命令:
它将使用默认样式和新的替代值。
最后,将样式设置为controls:
第二个和所有其他的
ps:HorizontalAlignment,VerticalAligment,Foreground应该在样式中定义,而不是直接在控件上定义,但是在那里也允许重写某些属性,但是没有必要在两个地方为同一个控件定义两个值。一定要好好参考...
2jcobegt2#
基类应该定义为没有任何XAML的类:
然后可以将其用作
Test1
的基类。Test1.xaml:
Test1.xaml.cs:
您不能覆盖模板,因此您在
TestBase.xaml
中定义的模板应该被删除或合并到样式定义的模板中。