2

ボタンとメニューの2つの項目でユーザーコントロールを作成しました。以下のコードはひどく単純化されたバージョンですが、それでも同じ問題があります(これについては以下で説明します)。

<UserControl x:Class="gemsTouchLensApplication.Controls.ButtonAndMenu"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="Horizontal">
        <Button/>
        <Menu/>
    </StackPanel>
</UserControl>

このユーザーコントロールで2つのことを実行できるようにしたいと思います。メニューに項目を追加することと、ボタンのコンテンツを設定することです。

従来の方法でメニューにアイテムを追加できるようにしたい

<Menu>
    <MenuItem Header="1"/>
    <MenuItem Header="2"/>
    <MenuItem Header="3"/>
        <MenuItem Header="4"/>
        <MenuItem Header="5"/>
    etc...
</Menu>

ただし、ユーザーコントロールをスタックパネルに追加した後でこれを実行しようとすると、

<Window>
    <StackPanel>
        <cntrls:ButtonAndMenu>
            <MenuItem Header="1"/>
            <MenuItem Header="2"/> <!--Comment this out and the error disappears-->
        </cntrls:ButtonAndMenu>
    </StackPanel>
</Window>

予期しないことが起こります。ユーザーコントロールに追加できるアイテムは1つだけです。複数のアイテムを追加すると、次のエラーが発生します。

プロパティ「コンテンツ」は一度だけ設定できます。

単一の項目のみが追加された場合、コントロールのビジュアルはメニューではなくボタンのビジュアルに近くなります。

ユーザーコントロールにコントロールを追加すると、WPFエンジンは、メニューにコントロールを追加するのではなく、デフォルトでボタンのコンテンツを設定するようになると思います。

コンシューマーが次のことができるように、ユーザーコントロールを変更するにはどうすればよいですか。

  1. 従来の表記法を使用してメニューに項目を追加します
  2. それでもボタンの内容を設定します
4

2 に答える 2

1

それを行う方法を見つけました。

MenuItemsという依存関係プロパティを作成し、メニューのアイテムソースをそれにバインドしました。また、ユーザーコントロールのクラスに属性を設定する必要がありました。

[ContentProperty("MenuItems")]
public partial class ButtonAndMenu: UserControl
{
    public ObservableCollection<DependencyObject> MenuItems
    {
        get { return (ObservableCollection<DependencyObject>)GetValue(MenuItemsProperty); }
        set { SetValue(MenuItemsProperty, value); }
    }

    internal static readonly DependencyProperty MenuItemsProperty = DependencyProperty.Register(
        "MenuItems", typeof(ObservableCollection<DependencyObject>), typeof(ButtonAndMenu),
        new FrameworkPropertyMetadata(new ObservableCollection<DependencyObject>()));
}

XAMLは次のようになります。

<UserControl x:Class="gemsTouchLensApplication.Controls.ButtonAndMenu"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         x:Name="root">
    <StackPanel Orientation="Horizontal">
        <Button/>
        <Menu ItemsSource={Binding ElementName=root, Path=MenuItems}/>
    </StackPanel>
</UserControl>

次に、メインウィンドウで次のことを実行できます。

<Window>
    <StackPanel>
        <cntrls:ButtonAndMenu>
            <MenuItem Header="1"/>
            <MenuItem Header="2"/>
            <MenuItem Header="3"/>
            <!--etc...    You can keep adding items here-->
        </cntrls:ButtonAndMenu>
    </StackPanel>
</Window>

したがって、要約すると:

  1. コレクションである依存関係プロパティを作成します
  2. クラスのContentProperty属性をその依存関係プロパティに設定します
  3. メニューのItemsSourceをそのプロパティにバインドします
于 2013-02-28T15:18:31.063 に答える
0

その理由MenuItemはから派生してItemsControlUserControlますが、ContentControlです。あなたはとして作る必要がありButtonAndMenuますItemsControl。カスタムMenuItemControlを作成してみませんか?

編集:

このリンクは役に立ちます。

1)カスタムWPFコントロールの作成と使用。このデモは、をにカスタマイズする方法を示していListBoxますColorPickerControl1

MenuItemControlにも同じ概念を使用できます。

UserControlを使用しなくなり、CustomControlは次のようになります。そのために、WPFでカスタムコントロールを作成する方法を学習する必要があります。

public class MyMenuItem : MenuItem
{ 
    // add your custom work here
}
于 2013-02-14T09:15:24.237 に答える