0

アイコンを含む「DropDownButton」を作成しようとしていますが、添付プロパティを介してアイコンソースを設定できるようにしたいと考えています(これが(唯一の)方法であることがわかりました)。しかし、何らかの理由で、私が試したことはすべて失敗しました。得られる最高のものは、空の Image コンテナーでした。

これはかなり良さそうだと思ったのですが、今では次のエラーが発生しています。

The local property "Image" can only be applied to types that are derived from "IconButton".
The attachable property 'Image' was not found in type 'IconButton'.
The attached property 'IconButton.Image' is not defined on 'Button' or one of its base classes.

私はおそらくこれを完全に間違っています (私は約 2 時間にわたって編集を試みてきました) が、これを行う方法があるに違いないことはわかっています。

関連するコードを以下に示します。誰かが私を正しい方向に向けることさえできれば、それは素晴らしいことです!

編集:コードを更新しましたが、まだ問題が発生しています

今、デバッグ ログに次のエラーが表示されます。

System.Windows.Data Error: 40 : BindingExpression path error: 'Image' property not found on 'object' ''ContentPresenter' (Name='')'. BindingExpression:Path=Image; DataItem='ContentPresenter' (Name=''); target element is 'Image' (Name=''); target property is 'Source' (type 'ImageSource')

ImageButton.cs (Viv に感謝):

class ImageButton : Button
{
    public static readonly DependencyProperty ImageProperty =
        DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton),
        new FrameworkPropertyMetadata(null,
            FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender));

    public ImageSource Image
    {
        get { return (ImageSource)GetValue(ImageProperty); }
        set { SetValue(ImageProperty, value); }
    }
}

画像ボタンのスタイル:

<Style TargetType="{x:Type Controls:ImageButton}" x:Key="FormIconDropDownButton">
    <Setter Property="Margin" Value="5" />
    <Setter Property="Padding" Value="10,5,4,5" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate DataType="{x:Type Controls:ImageButton}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>

                    <Image Style="{StaticResource FormButtonIcon-Small}"
                           Source="{Binding Image, RelativeSource={RelativeSource TemplatedParent}}"/>

                    <TextBlock Grid.Column="1"
                                Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"
                               VerticalAlignment="Center"
                               Margin="0,0,9,0"/>

                    <Path Grid.Column="2"
                          Fill="Black" 
                          Data="M 0 0 L 3.5 4 L 7 0 Z"
                          VerticalAlignment="Center"/>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

ウィンドウ xaml で:

<Controls:ImageButton Content="Hello"
                              Style="{StaticResource FormIconDropDownButton}"
                              Image="{StaticResource Icon-Small-Locations}" />
4

4 に答える 4

1

これは、基本クラスの拡張の私の例です。スタイルとビューで依存関係プロパティを使用します。詳細については、この投稿に書いてください。

public class ItemsList : ListView {
      public static readonly DependencyProperty ItemIconProperty = DependencyProperty.Register("ItemIcon", typeof(ImageSource), typeof(ItemsList));
      public ImageSource ItemIcon {
         get { return (ImageSource)GetValue(ItemIconProperty); }
         set { SetValue(ItemIconProperty, value); }
      }  

      public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(ItemsList));
      public ControlTemplate DoubleClickCommand {
         get { return (ControlTemplate)GetValue(DoubleClickCommandProperty); }
         set { SetValue(DoubleClickCommandProperty, value); }
      }
}

/ 'ItemIcon' DependencyProperty Declared である拡張 ItemList のスタイル/

<Style x:Key="BaseDataSourcesWindowListMenuStyle" TargetType="Controls:ItemsList">    
    <Setter Property="ItemIcon" Value="/Presentation.Shared;component/Resources/Images/data_yellow.png" />    
  </Style>

  <Style x:Key="DataSourcesListMenuStyle" TargetType="Controls:ItemsList"
         BasedOn="{StaticResource BaseDataSourcesWindowListMenuStyle}">    
    <Setter Property="DoubleClickCommand" Value="{Binding Path=VmCommands.EditDataSourceDBCommand}" />
  </Style>

/ビューで 'ItemIcon' DependencyProperty を使用する方法/

<Controls:ItemsList Grid.Column="0" Grid.Row="1" Margin="8" ItemsSource="{Binding DataSourceDbs}"
                        Style="{DynamicResource DataSourcesListMenuStyle}"
                        SelectedItem="{Binding SelectedDataSourceDB, Mode=TwoWay}" />
于 2013-06-18T13:48:23.530 に答える
1

添付プロパティを宣言していないことを除いて、すべてが正しいように見えます。DependencyProperty代わりに、クラスで法線を宣言しただけで、それを設定するか、それから派生したクラスIconButtonにのみ有効です。IconButton添付プロパティ (任意の型で設定可能) の宣言では、別の呼び出しを使用して登録し、ラッパー プロパティの代わりに get/set メソッドも使用します。

    public static readonly DependencyProperty ImageProperty =
        DependencyProperty.RegisterAttached(
        "Image",
        typeof(ImageSource),
        typeof(IconButton),
        new FrameworkPropertyMetadata(null,
            FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender));

    public static ImageSource GetImage(DependencyObject target)
    {
        return (ImageSource)target.GetValue(ImageProperty);
    }

    public static void SetImage(DependencyObject target, ImageSource value)
    {
        target.SetValue(ImageProperty, value);
    }
于 2013-06-18T13:43:41.713 に答える