2009-07-19 1 views
0

RadioButtonのみを含むカスタムコントロールを作成したいとします。WPFでのRadioButtonsのCustomContainerに関する問題

<RadioButtonHolder Orientation="Horizontal"> 
<RadioButton>RadioButton 1</RadioButton> 
<RadioButton>RadioButton 2</RadioButton> 
<RadioButton>RadioButton 3</RadioButton> 
<RadioButton> ...</RadioButton> 
</RadioButtonHolder> 

現在、私は部分的にこれを行うカスタムコントロールを作成しました。しかし、それはRadioButtonsの進行中のコレクションを維持するようです。そして、このRadioButtonのコレクションを最後に初期化されたコントロールに追加します。誰がなぜこのことが分かっているのですか?どんな助けでも大歓迎です。

編集: これで何が起こったのかわかりました。オブジェクトが初期化されると、すべてのRadioButtonを含むRadioButtonsのリストが作成され、ウィンドウのすべてのRadioButtonHolderコントロールに子として添付されます。最後のコントロールはアイテムを表示します。

しかし、私はこれを防止し、各コントロールにのみコンテンツをローカライズする方法がわかりません。

<RadioButtonHolder Name="RBH1"> 
<RadioButton Name="RB1">RB 1</RadioButton> 
<RadioButton Name="RB2">RB 2</RadioButton> 
</RadioButtonHolder> 
<RadioButtonHolder Name="RBH2"> 
<RadioButton Name="RB3">RB 3</RadioButton> 
<RadioButton Name="RB4">RB 4</RadioButton> 
</RadioButtonHolder> 

RB1 & RB2RBH1RB3 & RB4に表示されますRBH2に子供のように表示されます。私が書いた場合ようにします。 WPFは、可能な限り使用するように単純なことを意図している

CustomControl.cs

using System.Collections.Generic; 
using System.Windows; 
using Sytem.Windows.Controls; 
using System.Windows.Markup; 

namespace RandomControl 
{ 
[ContentProperty("Children")] 
public class CustomControl1 : Control 
{ 
    public static DependencyProperty ChildrenProperty = 
     DependencyProperty.Register("Children", typeof(List<RadioButton>), 
     typeof(CustomControl1),new PropertyMetadata(new List<RadioButton>())); 

    public List<RadioButton> Children 
    { 
     get { return (List<RadioButton>)GetValue(ChildrenProperty); } 
     set { SetValue(ChildrenProperty, value); } 
    } 

    static CustomControl1() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), 
      new FrameworkPropertyMetadata(typeof(CustomControl1))); 
    } 
} 
} 

Generic.xaml

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:RandomControl"> 
<Style TargetType="{x:Type local:CustomControl1}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <ItemsControl ItemsSource="{TemplateBinding Children}" 
         Background="{TemplateBinding Background}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <StackPanel></StackPanel> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
        </ItemsControl> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</ResourceDictionary> 

答えて

0

私は間違っていたことを知りました!それは私の目の前にあって、私はそれを見ませんでした。

この問題の問題は、ChildrenがDependencyPropertyとして設定されていたことです。つまり、静的でグローバルになります。したがって、全体のRadioButtonコレクションは、ウィンドウ内のすべてのコントロールで利用可能でした。 (おそらくStackPanel、CanvasなどがChildrenのDependencyPropertyプロパティを持っていない理由の後見で)。 この詳細については、hereをご覧ください。

これを行う簡単な方法を投稿してくれてありがとうkek444。 :D

これを修正するには、DependencyPropertyを削除し、子を通常のプロパティとしてプライベートsetと宣言します。

CustomControl.cs

using System.Collections.Generic; 
using System.Windows; 
using Sytem.Windows.Controls; 
using System.Windows.Markup; 

namespace RandomControl 
{ 
    [ContentProperty("Children")] 
    public class CustomControl1 : Control 
    { 
     private ObservableCollection<RadioButton> _children; 
     private ItemsControl _control; 

     public ObservableCollection<RadioButton> Children 
     { 
      get 
      { 
       if (_children == null) 
        _children = new ObservableCollection<RadioButton>(); 
       return _children; 
      } 
      private set { _children = value; } 
     } 

     static CustomControl1() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), 
      new FrameworkPropertyMetadata(typeof(CustomControl1))); 
     } 

     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 

      _control = base.GetTemplateChild("PART_ItemsControl") 
          as ItemsControl; 

      // display the radio buttons 
      if (_control != null) 
       _control.ItemsSource = Children; 
     } 
    } 
} 

Generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:RandomControl"> 
<Style TargetType="{x:Type local:CustomControl1}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <ItemsControl Name="PART_ItemControl" 
         Background="{TemplateBinding Background}"> 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <StackPanel></StackPanel> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
        </ItemsControl> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</ResourceDictionary> 
このため
0

を、次のように

私のコードですしかし、また非常に新しく、始めに入るのは簡単ではありません。

必要なのは、このようないくつかのXAMLです:

あなたのウィンドウで/ページ/ユーザーコントロールのリソースが必要なところはどこでもその後、あなたの "radioButtonHolder" を宣言し

<Style x:Key="rbStyle" TargetType="RadioButton"> 
    <!--modify style to fit your needs--> 
    <Setter Property="Margin" Value="2"/> 
</Style> 

<Style x:Key="rbStackPanelStyle" TargetType="StackPanel"> 
    <!--modify style to fit your needs--> 
    <Setter Property="Orientation" Value="Vertical"/> 
    <Setter Property="Margin" Value="2"/> 
</Style> 

を追加します。

<StackPanel x:Name="rbHolder1" Style="{StaticResource rbStackPanelStyle}"> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 1</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 2</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">RadioButton 3</RadioButton> 
    <RadioButton Style="{StaticResource rbStyle}">...</RadioButton> 
</StackPanel> 

それはあなたの質問に応じて、あなたのニーズに合っているはずです。カスタムコントロールは必要ありません。また、スタイルやテンプレートの中には、さらに多くの変更を加えることができます。

これは役に立ちました、歓声。

+0

感謝:

私は、コードを変更しました! :)それはこのようにするのが理にかなっています。 元々、私が所有者にして欲しいのは、ラジオボタンにInkPresenterをオーバーレイして、すばらしいペンのやりとりができるようにすることでした。 – Nilu