簡體   English   中英

讓用戶在運行時自定義用戶控件的內容屬性

[英]Letting users customize content property of user control at run-time

這是必需的行為:

我在畫布上有各種控件,例如標注(來自Expression Blend .dll)或簡單的標簽。 當用戶“雙擊”(或我決定參與的其他任何事件)時,控件應更改其外觀以允許用戶編輯控件的Content屬性。 單擊該控件,然后應將其重新設置為“只讀”方法。

關於如何最好地實現這一點的任何建議? 理想情況下,我想在c#中完成所有操作,以在運行時將此行為添加到控件中(因為此控件是動態添加到畫布中的)-並完全避免使用XAML。

我認為我必須與裝飾者一起做一些事情,以在所需的事件上顯示綁定到控件的content屬性的文本框,但是某些代碼示例或其他地方的鏈接會受到贊賞嗎? :)-我無法在現有搜索中找到任何內容,但我認為它應該相當簡單。

不幸的是,樣式觸發器對IsReadOnly和IsEnabled無效。 您必須從事件中做到這一點。

這是我的示例:

WPF:

<Window x:Class="StateChangingTextbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="IsMouseOver"  Value="True">
                    <Setter Property="Background" Value="#eee" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBox Width="300" Height="200" TextWrapping="Wrap" IsReadOnly="True" 
            MouseEnter="TextBox_MouseEnter"
            MouseLeave="TextBox_MouseLeave"/>
    </Grid>
</Window>

后台代碼:

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

    private void TextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        var textbox = sender as TextBox;
        if (textbox != null)
        {
            textbox.IsReadOnly = false;
        }
    }

    private void TextBox_MouseLeave(object sender, MouseEventArgs e)
    {
        var textbox = sender as TextBox;
        if (textbox != null)
        {
            textbox.IsReadOnly = true;
        }
    }
}

XAML:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
mc:Ignorable="d"
x:Class="ComicWPF.Bubble"
x:Name="UserControl" Height="100" Width="200">

<Canvas LostFocus="this_LostFocus">
    <ed:Callout x:Name="callout" Content=""
        AnchorPoint="0,1" FontSize="14" Height="100" Width="200" 
        Fill="Blue" 
        PreviewMouseDoubleClick="Callout_DoubleClick"
        Canvas.Left="0" Canvas.Top="0" />
    <TextBox x:Name="textbox"
             FontSize="14" 
             Canvas.Left="30" Height="55" Width="80" Canvas.Top="30"
             Visibility="Visible"/>
</Canvas>
</UserControl>

C#代碼:

  private void Callout_DoubleClick(object sender, MouseButtonEventArgs e)
    {
        Activate();
    }

    public void Activate()
    {
                //set bool activated to true
                //make textbox visible and set focus and select all text
    }

    private void Callout_DeSelect()
    {
            //set content of callout to the textbox.Text
            //Hide textbox
            //set bool activated to false
    }

    private void this_LostFocus(object sender, RoutedEventArgs e)
    {
        Callout_DeSelect();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM