WPF显示“虚拟”控制,直到聚焦/点击

时间:2015-07-17 14:33:32

标签: c# wpf performance

我有一个重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>

任何人都知道更好的方法或我缺少的东西?

2 个答案:

答案 0 :(得分:1)

我不知道这是否是更好的解决方案,但您可以在代码中创建重控制,然后在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);
    }

答案 1 :(得分:0)

这是我设法工作的一般概念。

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;
            }
        }
    }
}