WPF秀“假人”;控制,直到聚焦/点击

本文关键字:聚焦 点击 控制 假人 WPF | 更新日期: 2023-09-27 18:03:10

我有一个重Controls列表,我不想在用户与它们交互之前渲染(一次一个)。我想为每个Control显示一个占位符,直到占位符被单击(最好是聚焦),然后渲染真正的Control

我试过的是这样的:

            <ContentControl x:Name="theControl">
            <TextBox x:Name="TextBlock" Text="Placeholder right here."/>
            <ContentControl.Style>
                <Style TargetType="ContentControl">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsFocused, ElementName=TextBlock}" Value="True">
                            <Setter Property="Content" >
                                <Setter.Value>
                                    <Grid x:Name="theGrid">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto" SharedSizeGroup="CodeColumn"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock>Heavy control part1</TextBlock>
                                        <TextBlock Grid.Column="1">heavy control part2</TextBlock>
                                    </Grid>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
谁知道更好的方法或者我错过了什么?

WPF秀“假人”;控制,直到聚焦/点击

我不知道这是否是一个更好的解决方案,但您可以在代码中创建重控件,然后在GotFocus事件后删除/添加子控件。

添加一个GotFocus事件到你的TextBlock,并把TextBlock放在一个网格

        <Grid Name="myGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="100*"/>
            </Grid.RowDefinitions>
            <TextBox x:Name="TextBlock" Grid.Column="0" Grid.Row="0"  Text="Placeholder right here." GotFocus="TextBlock_GotFocus" />
        </Grid>

然后在cs文件

    private void TextBlock_GotFocus(object sender, RoutedEventArgs e)
    {
        createNewControl();
    }
    private void createNewControl()
    {
        Grid myOtherGrid = new Grid();
        RowDefinition newRow1 = new RowDefinition();
        newRow1.Height = new GridLength(100.0);
        RowDefinition newRow2 = new RowDefinition();
        newRow2.Height = new GridLength(100.0);
        ColumnDefinition newColumn1 = new ColumnDefinition();
        newColumn1.Width = new GridLength(50.0);
        ColumnDefinition newColumn2 = new ColumnDefinition();
        newColumn2.Width = new GridLength(50.0);
        myOtherGrid.RowDefinitions.Add(newRow1);
        myOtherGrid.RowDefinitions.Add(newRow2);
        myOtherGrid.ColumnDefinitions.Add(newColumn1);
        myOtherGrid.ColumnDefinitions.Add(newColumn2);
        TextBox myOtherTextBlock1 = new TextBox();
        myOtherTextBlock1.Text = "new block 1";
        TextBox myOtherTextBlock2 = new TextBox();
        myOtherTextBlock2.Text = "new block 1";
        myOtherGrid.Children.Add(myOtherTextBlock1);
        Grid.SetRow(myOtherTextBlock1, 0);
        Grid.SetColumn(myOtherTextBlock1, 0);
        myOtherGrid.Children.Add(myOtherTextBlock2);
        Grid.SetRow(myOtherTextBlock2, 1);
        Grid.SetColumn(myOtherTextBlock2, 1);
        myGrid.Children.Remove(TextBlock);
        myGrid.Children.Add(myOtherGrid);
    }

这是我设法使工作的总体思路。

public partial class PlaceHolder : UserControl
{
    private bool m_isReadOnly;
    private object m_PlaceholdeContent;
    private bool m_hasValue;
    private object m_realContent;
    public PlaceHolder()
    {
        InitializeComponent();
        GotFocus += OnGotFocus;
    }
    private void OnGotFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        GotFocus -= OnGotFocus;
        if (!RealContentIsUsed)
        {
            RealContentIsUsed = true;
            Content = RealContent;
        }
    }
    private bool RealContentIsUsed { get; set; }
    public object RealContent
    {
        get { return m_realContent; }
        set
        {
            m_realContent = value;
            if (IsReadOnly || HasValue)
            {
                Content = m_realContent;
            }
        }
    }
    public object PlaceholdeContent
    {
        get { return m_PlaceholdeContent; }
        set
        {
            m_PlaceholdeContent = value;
            if (!RealContentIsUsed)
            {
                Content = m_PlaceholdeContent;
            }
        }
    }
    public bool IsReadOnly
    {
        get { return m_isReadOnly; }
        set
        {
            m_isReadOnly = value;
            if (value && !RealContentIsUsed)
            {
                Content = RealContent;
                RealContentIsUsed = true;
            }
        }
    }
    public bool HasValue
    {
        get { return m_hasValue; }
        set
        {
            m_hasValue = value;
            if (HasValue && RealContentIsUsed == false)
            {
                Content = RealContent;
                RealContentIsUsed = true;
            }
        }
    }
}