2012-03-24 7 views
1

Dies ist das erforderliche Verhalten:Benutzer die Inhaltseigenschaft der Benutzersteuerung zur Laufzeit anpassen

Ich habe verschiedene Steuerelemente auf der Leinwand z. Callouts (aus Expression Blend .dll) oder einfache Labels. Wenn der Benutzer auf ein doppeltes Klicken klickt (oder auf ein anderes Ereignis, das ich festlegen möchte), sollte das Steuerelement seine Darstellung ändern, damit der Benutzer die Inhaltseigenschaft des Steuerelements bearbeiten kann. Wenn Sie auf das Steuerelement klicken, sollten Sie es wieder auf die schreibgeschützte Methode zurücksetzen.

Irgendwelche Vorschläge, wie dies am besten erreicht werden könnte? Im Idealfall möchte ich dies alles in C# tun, um dieses Verhalten zur Laufzeit dem Steuerelement hinzuzufügen (da dieses Steuerelement dynamisch zur Arbeitsfläche hinzugefügt wird) - und XAML ganz zu vermeiden.

Ich denke, ich muss etwas mit Adornern tun, um eine Textbox anzuzeigen, die an die Inhaltseigenschaft des Steuerelements für das erforderliche Ereignis gebunden ist, aber einige Codebeispiele oder Links an anderer Stelle wären willkommen? :) - Ich konnte bei einer bestehenden Suche nichts finden, aber ich denke, es sollte ziemlich einfach sein.

Antwort

0

Leider führen Stilauslöser nichts mit IsReadOnly und IsEnabled. Sie müssten das von einer Veranstaltung aus tun.

Hier ist mein Beispiel:

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> 

-Code-behind:

/// <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; 
     } 
    } 
} 
+0

Danke für deinen Code, es hat mich auf den Weg gebracht. Am Ende habe ich einfach alle Style-Trigger gemieden und ein eigenes User Control erstellt, indem ich Methoden hinzugefügt und deaktiviert habe, um die Ansicht des Controls zu ändern. Diese Methoden habe ich mit dem Doppelklick-Ereignis des Controls verbunden (activate) und den Fokus verloren (de-activate). Ich habe meinen Code veröffentlicht, wenn es jemandem hilft. – mistercormell

0

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# Code:

012.351.
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(); 
    } 
} 
Verwandte Themen