2012-03-24 11 views
1

これで必要な行動:まかせユーザーが実行時にユーザーコントロールのcontentプロパティをカスタマイズ

私はキャンバスなどに存在する様々な制御を持っています吹出し(Expression Blend .dllから)、またはシンプルなラベル。ユーザーがダブルクリックすると、コントロールの外観が変更され、コントロールのContentプロパティを編集できるようになります。コントロールをクリックすると、「読み取り専用」メソッドに戻ります。

これがどのようにして最高の成果を達成するかについてのご意見はありますか?理想的には、これをC#ですべて実行して、実行時にこの動作をコントロールに追加します(このコントロールはキャンバスに動的に追加されるため)。また、XAMLを完全に回避します。

私は、必要なイベントでコントロールのコンテンツプロパティにバインドされたテキストボックスを表示するために飾り文字を使って何かをしなければならないと思いますが、コードサンプルやリンクは他にもあります。 :) - 私は既存の検索で何かを見つけることができませんでしたが、私はそれはかなり単純であると考えます。

答えて

0

残念ながら、スタイルトリガーは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; 
     } 
    } 
} 
+0

コードをお寄せいただきありがとうございます。最後に、私はちょうどスタイルのトリガを避け、独自のUser Controlを作成し、メソッドのアクティブ化と非アクティブ化を追加してコントロールのビューを変更しました。このメソッドは、コントロールのダブルクリックイベント(有効化)に接続し、フォーカスを失いました(非アクティブ化)。誰かを助けるなら私は自分のコードを掲載しています。 – 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#コード:

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(); 
    } 
} 
関連する問題