【问题标题】:WPF Changing ContentTemplate in UserControl by TriggerWPF通过触发器更改UserControl中的ContentTemplate
【发布时间】:2014-12-06 00:25:10
【问题描述】:

期望

我的控件应如Figure 1 所示。单击标题为“第二”的按钮后,控件的内容应该会发生变化,如Figure 2 所示。在这个图中,状态应该是内容在发送密钥后再次变回输入文本框。

解决方案

我创建了两个 DataTemplate。这些 DataTemplate 应根据 IsEditable 属性的更改而更改。默认 DataTemplate 称为 CompactDataTemplate,当 IsEditable 值等于 FALSE 时应使用该模板。 当 IsEditable 变为 TRUE 时,应使用 EditableDataTemplate

文件 TestUserControl.xaml

<UserControl x:Class="JP4.Controls.TestControl"
         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="26" d:DesignWidth="200" Style="{DynamicResource TestControlStyle}">
<UserControl.Resources>

CompactDataTemplate

<DataTemplate x:Key="CompactDataTemplate" DataType="{x:Type UserControl}">
    <StackPanel Orientation="Horizontal">
        <Button Content="First Button" />
        <Button Content="Second Button" Click="SecondButton_Click" />
    </StackPanel>
</DataTemplate>

可编辑数据模板

<DataTemplate x:Key="EditableDataTemplate" DataType="{x:Type UserControl}">
    <StackPanel Orientation="Horizontal">
        <TextBox Text="Press enter" />
    </StackPanel>
</DataTemplate>

TestControlStyle 包含在 IsEditable 已更改时应触发的触发器

<Style x:Key="TestControlStyle" TargetType="{x:Type UserControl}">
        <Setter Property="ContentTemplate" Value="{StaticResource CompactDataTemplate}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type UserControl}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsEditable}" Value="true">
                            <Setter Property="ContentTemplate" Value="{StaticResource EditableDataTemplate}" />
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

</UserControl>

文件TestUserControl.xaml.cs

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace TestControl
{
/// <summary>
/// Interaction logic for TestControl.xaml
/// </summary>
public partial class TestUserControl : UserControl, INotifyPropertyChanged, INotifyPropertyChanging
{
    /// <summary>
    /// Constructors
    /// </summary>
    public TestUserControl()
    {
        InitializeComponent();
    }

    // Properties
    private bool _IsEditable;

    public bool IsEditable
    {
        get { return _IsEditable; }
        set
        {

            _IsEditable = value;
            NotifyPropertyChanged("IsEditable");
        }
    }

    // Controls events
    private void SecondButton_Click(object sender, RoutedEventArgs e)
    {
        IsEditable = true;
    }

    private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.Enter)
            IsEditable = false;
    }

    // INotifyPropertyChanged implementation
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public void NotifyPropertyChanging(string propertyName)
    {
        if (PropertyChanging != null)
            PropertyChanging.Invoke(this, new PropertyChangingEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public event PropertyChangingEventHandler PropertyChanging;


  }
}

MainWindow.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestControl" x:Class="TestControl.MainWindow"
    Title="MainWindow" Height="170" Width="328">
    <Grid>
        <local:TestUserControl HorizontalAlignment="Left" Margin="76,57,0,0" VerticalAlignment="Top" Width="148"/>
    </Grid>
</Window>

最后是 MainWindow.xaml.cs

using System.Windows;

namespace TestControl
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
}

希望,现在很清楚,我想要什么。我想更改我的 UserControlContentTemplate。此更改应由监视属性 IsEditable 的触发器触发。

问题

IsEditable 属性正在更改,但触发器未触发。问题出在哪里?

对于我之前不清楚的帖子,我深表歉意。

所有可以从与 Figures 相同的位置下载的项目文件只需将文件名更改为 TestControl.zip(不能发布超过两个链接)

【问题讨论】:

  • 没有一个好的代码示例,我不完全理解您要完成的工作。见stackoverflow.com/help/mcve。使用您提供的代码并尝试猜测您是如何使用它的,我什至无法显示初始模板。 IE。 UserControl 显示时没有任何模板数据。
  • DataTemplateSelector 怎么样?

标签: c# wpf xaml user-controls


【解决方案1】:

已解决!!!

我只是把作为我的用户控件 ContentControl 的内容

<ContentControl Style="{StaticResource UserControlStyle1}" />

ContentControl 的样式如下所示:

<Style x:Key="UserControlStyle1" TargetType="{x:Type ContentControl}">

这里是定义的默认模板

        <Setter Property="ContentTemplate" Value="{StaticResource CompactStyle}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ContentControl}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>

这是运行良好的触发器

                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:PathNavigator}}}"  Value="True">
                            <Setter Property="ContentTemplate" PresentationTraceSources.TraceLevel="High" Value="{StaticResource EditableStyle}"  />
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

            </Setter.Value>
        </Setter>
    </Style>

当然,我从 UserControl 中删除了样式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多