我有一個帶有兩個模板的自定義用戶控制元件,我想將它們一起用于選項卡控制元件中的每個專案。我一次只能使用一個。
自定義用戶控制元件.xaml.cs
public partial class CustomUserControl : UserControl
{
public CustomUserControl ()
{
InitializeComponent();
var style = (Style)FindResource("Styling");
Style = style;
}
public static readonly DependencyProperty ItemHeaderTemplateProperty = DependencyProperty.Register(
nameof(ItemHeaderTemplate), typeof(DataTemplate),
typeof(ConfigurableCollectionControl), new PropertyMetadata(default(DataTemplate)));
public DataTemplate ItemHeaderTemplate
{
get => (DataTemplate) GetValue(ItemHeaderTemplateProperty);
set => SetValue(ItemHeaderTemplateProperty, value);
}
public static readonly DependencyProperty ItemContentTemplateProperty = DependencyProperty.Register(
nameof(ItemContentTemplate), typeof(DataTemplate),
typeof(ConfigurableCollectionControl), new PropertyMetadata(default(DataTemplate)));
public DataTemplate ItemContentTemplate
{
get => (DataTemplate) GetValue(ItemContentTemplateProperty);
set => SetValue(ItemContentTemplateProperty, value);
}
}
我可以在這樣的選項卡控制元件中參考其中之一:
自定義用戶控制元件.xaml
<Style x:Key="Styling" TargetType="{x:Type local:CustomUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomUserControl}">
<TabControl Style="{Static CustomStyle}"
ItemsSource="{Binding Items}"
ContentTemplate="{TemplateBinding ItemContentTemplate}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
注意:我從主頁參考它,如下所示: MainPage.xaml
<test:CustomUserControl Content="{Binding}"
ItemHeaderTemplate="{StaticResource TestHeaderTemplate}"
ItemContentTemplate="{StaticResource TestContentTemplate}"/>
我曾嘗試使用 DataTemplate 像這樣參考它們,但該專案無法編譯:
自定義用戶控制元件.xaml
<DataTemplate x:Key="TestTemplate" DataType="{x:Type local:CustomUserControl}">
<StackPanel>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemHeaderTemplate}"/>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemContentTemplate}"/>
</StackPanel>
</DataTemplate>
<Style x:Key="Styling" TargetType="{x:Type local:CustomUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomUserControl}">
<TabControl Style="{Static CustomStyle}"
ItemsSource="{Binding Items}"
ContentTemplate="{StaticResource TestTemplate}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果我做同樣的事情,但使用 ControlTemplate,它會編譯,但當我導航到頁面時會崩潰:
自定義用戶控制元件.xaml
<ControlTemplate x:Key="TestTemplate" DataType="{x:Type local:CustomUserControl}">
<StackPanel>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemHeaderTemplate}"/>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemContentTemplate}"/>
</StackPanel>
</ControlTemplate>
<Style x:Key="Styling" TargetType="{x:Type local:CustomUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomUserControl}">
<TabControl ItemsSource="{Binding Items}"
ContentTemplate="{StaticResource TestTemplate}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
似乎 ControlTemplate 將允許我參考 CustomUserControl 模板,但不能將其用作 ContentTemplate。雖然 DataTemplate 可以用作 ContentTemplate,但不允許我參考 CustomUserControl 模板。
這讓我嘗試使用 DataTemplate 和其中參考的 ControlTemplate,如下所示。
自定義用戶控制元件.xaml
<ControlTemplate x:Key="TestControlTemplate" DataType="{x:Type local:CustomUserControl}">
<StackPanel>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemHeaderTemplate}"/>
<ContentControl Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ItemContentTemplate}"/>
</StackPanel>
</ControlTemplate>
<DataTemplate x:Key="TestDataTemplate" DataType="{x:Type local:CustomUserControl}">
<StackPanel>
<ContentControl Template="{StaticResource TestControlTemplate}"/>
</StackPanel>
</DataTemplate>
<Style x:Key="Styling" TargetType="{x:Type local:CustomUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomUserControl}">
<TabControl ItemsSource="{Binding Items}"
ContentTemplate="{StaticResource TestDataTemplate}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但隨后它又崩潰了。我收到這條訊息
''CustomUserControl' ControlTemplate TargetType 與模板化型別 'ContentControl' 不匹配。
如果我將 ControlTemplate 的 TargetType 更改為 ContentControl,則該專案不會編譯。
有沒有辦法做到這一點?或者我需要以完全不同的方式做到這一點嗎?
uj5u.com熱心網友回復:
我將 UserControl 的名稱設定為 UserControlName
<UserControl ...
Name="UserControlName">
然后我使用 Source & Path 來訪問我在 CustomUserControl 中定義的 ItemHeaderTemplate & ItemContentTemplate 模板
<ControlTemplate x:Key="TestControlTemplate" DataType="{x:Type local:CustomUserControl}">
<StackPanel>
<ContentControl Content="{Binding}"
ContentTemplate="{Binding Source={x:Reference UserControlName},
Path=ItemHeaderTemplate}"/>
<ContentControl Content="{Binding}"
ContentTemplate="{Binding Source={x:Reference UserControlName},
Path=ItemContentTemplate}"/>
</StackPanel>
</ControlTemplate>
<DataTemplate x:Key="TestDataTemplate" DataType="{x:Type local:CustomUserControl}">
<ContentControl Template="{StaticResource TestControlTemplate}"/>
</DataTemplate>
<Style x:Key="Styling" TargetType="{x:Type local:CustomUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomUserControl}">
<TabControl ItemsSource="{Binding Items}"
ContentTemplate="{StaticResource TestDataTemplate}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345954.html
