我对 WPF 很陌生,我想创建一个可重用的基本 UserControl。
例如我有这个用户控件:TestBase
<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>
UserControl TestBase 使用此样式(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>
现在我想创建第二个从 TestBase 扩展的 UserControl。
目前看起来像这样:Test1
<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>
必须从用户控件中删除链接,否则我无法发布问题。
我想知道的是,是否可以从TestBase而不是UserControl扩展Test1,以便我可以从基础访问属性,使用其中的样式并覆盖默认内容?
如果不行,还有其他方法可以实现吗?
基类应该定义为没有任何 XAML 的类:
public class TestBase : UserControl
{
public TestBase()
{
Style = FindResource("TestBaseDefault") as Style;
}
}
然后您可以将其用作
Test1
的基类。
测试1.xaml:
<local:TestBase x:Class="WpfApp1.Test1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="Overriden Text"
HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="White"/>
</Grid>
</local:TestBase>
Test1.xaml.cs:
public partial class Test1 : TestBase
{
public Test1()
{
InitializeComponent();
}
}
您无法覆盖模板,因此您在
TestBase.xaml
中定义的模板应被删除或合并到样式定义的模板中。