1

カスタム コントロールの作成は初めてです。Selector クラスに基づく新しいカスタム コントロールの基礎を築きました。私の理解では、コントロールに Items コレクションと選択を処理する機能が必要だったので、このクラスを使用する必要があるということでした。コントロール レベルまたはアプリケーション レベルで SelectionChanged イベントを受信しないため、ItemTemplate を変更すると、この機能の一部が上書きされた可能性があると思います。私が正しければ、DataTemplate 内部に配置できる何らかの SelectionRegion XAML タグがあると思います。私はこのようなものを見つけることに運がありませんでした。Google をしばらく調べた後、質問する準備が整いました。私は何が欠けていますか?以下は ItemTemplate マークアップです。助けてくれてありがとう。

<Setter Property="ItemTemplate">
    <Setter.Value>
        <DataTemplate>
            <Border BorderBrush="Black" BorderThickness="1">
                <TextBlock Text="{Binding}" Foreground="Black" Background="White" MinHeight="12" MinWidth="50"/>
            </Border>
        </DataTemplate>
    </Setter.Value>
</Setter>

コメンターのリクエストにより、これまでのコントロールの完全な XAML を以下に示します。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SourceMedicalWPFCustomControlLibrary">
    <Style TargetType="{x:Type local:MultiStateSelectionGrid}">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border BorderBrush="Black" BorderThickness="1">
                        <TextBlock Text="{Binding Code}" Foreground="Black" Background="White" MinHeight="12" MinWidth="50" Padding="2" ToolTip="{Binding Description}"/>
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MultiStateSelectionGrid}">
                    <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0" Content="{TemplateBinding Content}"/>
                        <ItemsPresenter/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

そして貧血のコードビハインドも:

namespace SourceMedicalWPFCustomControlLibrary
{
    public class MultiStateSelectionGridState
    {
        public Brush Background { get; set; }
        public Brush Foreground { get; set; }
        public Brush Border { get; set; }
        public string Text { get; set; }

        public MultiStateSelectionGridState()
        {
            Background = Brushes.White;
            Foreground = Brushes.Black;
            Border = Brushes.Black;
            Text = String.Empty;
        }
    };

    public class MultiStateSelectionGrid : Selector
    {
        public static readonly DependencyProperty ContentProperty =
            DependencyProperty.Register("Content", typeof(object), typeof(MultiStateSelectionGrid),
            new FrameworkPropertyMetadata(null,
                  FrameworkPropertyMetadataOptions.AffectsRender |
                  FrameworkPropertyMetadataOptions.AffectsParentMeasure));

        public object Content
        {
            get { return (object)GetValue(ContentProperty); }
            set { SetValue(ContentProperty, value); }
        }

        public static readonly DependencyProperty StatesProperty =
            DependencyProperty.Register("States", typeof(List<MultiStateSelectionGridState>), typeof(MultiStateSelectionGrid),
            new FrameworkPropertyMetadata(new List<MultiStateSelectionGridState>(),
                FrameworkPropertyMetadataOptions.AffectsRender));

        public List<MultiStateSelectionGridState> States
        {
            get { return (List<MultiStateSelectionGridState>)GetValue(StatesProperty); }
            set { SetValue(StatesProperty, value); }
        }

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

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this.SelectionChanged += new SelectionChangedEventHandler(MultiStateSelectionGrid_SelectionChanged);
        }

        void MultiStateSelectionGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            MessageBox.Show("Hi");
        }
    }
}
4

2 に答える 2

0

さまざまなコントロールの完全なコード例をいくつか読んだ結果、私の答えは、これはすべて間違っているということだと思います。代わりに、ControlTemplate に ListBox のようなセレクターを持つコントロールが必要です。それから、@JKing のアドバイスは、私が必要な場所にたどり着くのに役立ちます。ただし、実際に尋ねられた質問に対する答えは、セレクターを基本クラスとして使用することから、コントロールのテンプレートにセレクターを使用することへの前述の変更です。助けてくれてありがとう。

于 2013-04-25T17:13:14.037 に答える
0

これが私がすることです。カスタム コントロールのテンプレート適用機能を使用して、必要なコントロールの選択変更イベントにハンドラーを追加します。

ここに簡単なサンプル:

public event EventHandler<SelectionChangedEventArgs> YourControlSelectionChanged;

private void Selector_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (ListSelectionChanged != null) {
        ListSelectionChanged(sender, e);
    }
}

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    //find or declare your control here, the x:name in xaml should be YourControl
    YourControl== this.Template.FindName("YourControl", this) as YourControlType
    YourControl.SelectionChanged += ResultListBox_SelectionChanged;
}

次に、xaml のカスタム コントロール クラスで宣言したパブリック イベント (YourControlSelectionChanged) の名前にバインドできます。

お役に立てれば。

于 2013-04-25T15:12:33.887 に答える