2011-01-24 18 views
0

私は、Mouse Mouse-Overイベントが発生したときに青色の薄い色合いに変わる青色の十字で表現されるカスタムCheckBoxコントロールを作成しようとしています。クリックされるとClickイベントが発生します。カスタムスタイルのWPFチェックボックスを純粋にコード内に作成する

私はコントロールテンプレートとスタイルを使用してXAMLコードでこれを行う方法を見てきましたが、純粋にコードの背後にはありません。前にコードでカスタムスタイルを作成して十分に適用しましたが、今度は、チェックボックス全体を青い十字の画像に置き換えるなど、今度は必要なカスタマイズの量に問題があります。

誰もがこれを行う標準的な方法を知っていますか? XAMLコードでテンプレート化された完全なスタイルを作成し、そのコードの新しいチェックボックスオブジェクトのプロパティを設定するときにそのテンプレートを参照できますか?

ありがとうございます。

答えて

2

XAMLを使用した宣言アプローチが廃止されていますが、これを行う必要がある場合があります。

XAMLを構築するには、FrameworkElementFactoryクラスをご覧ください。それはかなりきちんとしたパターンです。次のスニペットは、コード内でListViewのDataTemplateを作成した場所を示しています。私は時間報告アプリケーションのために月の日数に基づいて要素を動的に追加する必要がありました。

 GridView gv = new GridView(); 
     int i = 0; 
     foreach (string s in vm.DateList) 
     { 
      string column = string.Format("DisplayTime[{0}].Hours", i); 
      DataTemplate dt = new DataTemplate(); 

      DateTime date = DateTime.Parse(s); 

      bool isWeekday = true; 

      if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) 
      { 
       isWeekday = false; 
      } 

      Binding binding = new Binding(); 
      binding.Path = new PropertyPath(column); 
      binding.Mode = BindingMode.TwoWay; 

      FrameworkElementFactory gridElement = new FrameworkElementFactory(typeof(Grid)); 
      gridElement.SetValue(Grid.WidthProperty, 60.0); 
      gridElement.SetValue(Grid.HeightProperty, 94.0); 
      gridElement.SetValue(Grid.MarginProperty, new Thickness(0.0, 0.0, 0.0, 4.0)); 

      if (!isWeekday) 
      { 
       gridElement.SetValue(Grid.BackgroundProperty, new SolidColorBrush(Color.FromRgb(65, 65, 65))); 
      } 


      FrameworkElementFactory txtelement = new FrameworkElementFactory(typeof(TextBox)); 
      txtelement.SetBinding(TextBox.TextProperty, binding); 
      txtelement.SetValue(TextBox.WidthProperty, 40.0); 
      txtelement.SetValue(TextBox.HeightProperty, 20.0); 
      txtelement.SetValue(TextBox.VerticalAlignmentProperty, VerticalAlignment.Center); 
      txtelement.SetValue(TextBox.HorizontalAlignmentProperty, HorizontalAlignment.Center); 
      txtelement.SetValue(TextBox.TextAlignmentProperty, TextAlignment.Right); 

      gridElement.AppendChild(txtelement); 

      dt.VisualTree = gridElement; 

      gv.Columns.Add(new GridViewColumn() 
      { 
       Header = s, 
       //       DisplayMemberBinding = new Binding(column), 
       CellTemplate = dt 
      }); 
      i++; 
     } 

     ETCListView.View = gv; 
+0

私は、その本当に好ましくないアプローチを同意するが、残念ながらその私たちは(管理など見下ろす)FrameworkElementFactoryは一種のまさに私が何であったか、私は必要なもののために偉大に見えるこの現在のシナリオにして立ち往生していますフレームワークには希望があります。私はそれにバッシュを与え、それがどのように行くのかを見るでしょう、歓声! – Smallgods

+0

これは素晴らしい作品で、私に必要なコントロールを与えてくれます。私がうまくいくことができない唯一のことは、どのプロパティが実際にCheckBoxの視覚的表現を制御するかです。私が読んだXAMLの例では、 "Path"要素にあります。しかし、私はFrameWorkElementFactoryからそれに到達する明確な方法を見出すことができません。カスタムテンプレートを設定するだけでは不十分です。これは私を正方形に戻します。任意のアイデア/誰もが前にこの問題に遭遇する? – Smallgods

+0

私は、代わりにMouseOverイベントとOnClickイベントでImageを使用しました。その結果、必要な処理を実行するのに十分な動作が得られました。しかし、あなたのコードで行った実験では、うまくいきましたので、ありがとうございます。これが誰かを助けることを願っています。 – Smallgods

関連する問題