1

GridViewアプリケーション全体で、同じ視覚スタイルを使用していくつかのスタイルを設定する必要があります。このスタイルには、ItemsPanelプロパティだけでなくプロパティのカスタマイズも含まれGroupStyleます。

私の問題は、のGroupStyleプロパティがGridView依存関係プロパティではないことです。したがって、私が書きたかったコード (以下を参照) は機能しません。

GroupStyle複数の間でスタイル ( を含む)を共有するきれいな方法を知っていますGridViewか?

私が考えることができる唯一のことは、 a を使用することですGroupStyleSelectorが、行う選択がないので、それはちょっとばかげています:GroupStyle使用されているものは常に同じです。また、VS & Blend では設計時に反映されないのではないかと思います。

私が使いたいコード:

<GridView 
     ItemsSource="..."
     ItemTemplate="..."
     Style="{StaticResource MainMenuStyle}"/>

<Style TargetType="GridView" x:Key="MainMenuStyle">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            ...
        </Setter.Value>
    </Setter>
    <Setter Property="GroupStyle">
        <Setter.Value>
            <GroupStyle>
                ...
            </GroupStyle>
        </Setter.Value>
    </Setter>
</Style>

4

2 に答える 2

2

私は魔法の幸せな解決策を手に入れました。

スタイルで設定するカスタムの添付プロパティを作成できます。設定すると、GridView の GroupStyle プロパティが内部的に設定されます。

添付プロパティ:

// Workaround for lack of generics in XAML
public class GroupStyleCollection : Collection<GroupStyle>
{
}

public class GroupStyleHelper
{
    public static ICollection<GroupStyle> GetGroupStyle(ItemsControl obj)
    {
        return (ICollection<GroupStyle>)obj.GetValue(GroupStyleProperty);
    }

    public static void SetGroupStyle(ItemsControl obj, ICollection<GroupStyle> value)
    {
        obj.SetValue(GroupStyleProperty, value);
    }

    public static readonly DependencyProperty GroupStyleProperty =
        DependencyProperty.RegisterAttached(
            "GroupStyle",
            typeof(ICollection<GroupStyle>),
            typeof(GroupStyleHelper),
            new PropertyMetadata(null, OnGroupStyleChanged));

    private static void OnGroupStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ItemsControl itemsControl = d as ItemsControl;
        if (itemsControl == null)
            return;

        RefreshGroupStyle(itemsControl, GetGroupStyle(itemsControl));
    }

    private static void RefreshGroupStyle(ItemsControl itemsControl, IEnumerable<GroupStyle> groupStyle)
    {
        itemsControl.GroupStyle.Clear();

        if (groupStyle == null)
            return;

        foreach (var item in groupStyle)
        {
            itemsControl.GroupStyle.Add(item);
        }
    }
}

XAML スタイル:

    <Style TargetType="ItemsControl">
        <Setter Property="GroupStyleTest:GroupStyleHelper.GroupStyle">
            <Setter.Value>
                <GroupStyleTest:GroupStyleCollection>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock FontWeight="Bold" FontSize="15" Text="{Binding Path=Name}" Foreground="HotPink"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </GroupStyleTest:GroupStyleCollection>
            </Setter.Value>
        </Setter>
    </Style>

免責事項: WinRT ではなく WPF でこれをテストしていますが、私が知る限り、同じように動作するはずです。これが、GridView ではなく ItemsControl を使用している理由でもありますが、とにかくプロパティは ItemsControl.GroupStyle です。

于 2013-02-21T01:55:27.710 に答える
1

私は解決策を持っており、それはあなたの質問に従って間違いなく機能しますが、あなたのケースでそれを使用するかどうかを決定する必要があります.

  • プロジェクト全体で同じスタイルのコントロールを作成する必要がある場合は、1 つの共通フォルダーを作成し、そのフォルダーに 1 つの「カスタム ユーザー コントロール」を作成して、すべてのスタイルを適用し、必要に応じてカスタマイズする必要があります。

  • その後、同じコントロール (任意のグリッド コントロール) に同じ種類のスタイルを適用する必要がある場合は
    、事前定義されたコントロールの代わりにカスタマイズされたユーザー コントロールを追加するだけです。

これを行うことで、MVC アーキテクチャとモジュール性も実現できます。

私は XAML を使用して C# で Windows 8 Metro アプリを開発しています。その中で、このアプローチが必要なときはいつでもこのソリューションを使用し、常に機能します...

カスタム ユーザー コントロールを作成するには、Visual Studioを使用し、プロジェクトを右クリック -> 追加 -> 新しい項目 -> ユーザー コントロールを使用する必要があります。

(ここで解決策が見つからなかった場合は申し訳ありませんが、これが役立つと思います...)

于 2013-02-20T08:58:22.843 に答える