Разрешение пользователям настраивать свойство контента пользовательского элемента управления во время выполнения - PullRequest
1 голос
/ 24 марта 2012

Это обязательное поведение:

У меня есть различные элементы управления на холсте, например Выноски (из Expression Blend .dll) или простые метки. Когда пользователь «дважды щелкает» (или любое другое событие, которое я решил связать), элемент управления должен изменить свой внешний вид, чтобы позволить пользователю редактировать свойство Content элемента управления. Отключение элемента управления должно затем вернуться к методу «только для чтения».

Какие-нибудь предложения о том, как это было бы лучше всего достигнуто? В идеале я хочу сделать все это в c #, чтобы добавить это поведение к элементу управления во время выполнения (так как этот элемент управления динамически добавляется на холст) - и вообще избегать XAML.

Я считаю, что мне нужно что-то сделать с рекламодателями, чтобы отобразить текстовое поле, связанное со свойством содержимого элемента управления для требуемого события, но некоторые примеры кода или ссылки в других местах были бы полезны? :) - Мне не удалось найти что-либо в существующем поиске, но я считаю, что это должно быть довольно просто.

Ответы [ 2 ]

0 голосов
/ 31 марта 2012

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();
    }
}
0 голосов
/ 25 марта 2012

К сожалению, триггеры стиля ничего не делают с 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;
        }
    }
}
...