web-dev-qa-db-ja.com

WPFのコードビハインドを介したリソースへのアクセス

次のようにウィンドウリソースでカスタムコレクションを定義しています(Sketchflowアプリで、実際にはウィンドウはUserControlです):

<UserControl.Resources>
    <ds:MyCollection x:Key="myKey" x:Name="myName" />
</UserControl.Resources>

コードビハインドでこのコレクションを参照できるようにしたいのですが、これはx:Nameによるものと予想されますが、アクセスできないようです。

私はそれを参照することができます

myRef = (MyCollection) this.FindName("myKey");

しかし、これはハックのようです。これは悪い習慣ですか、何が良いでしょうか?ありがとう:)

61
randomsequence

_System.Windows.Controls.UserControl_のFindResource()またはTryFindResource()メソッドを使用する必要があります。

また、キーの名前をリソースディクショナリにマッピングする文字列定数を作成することをお勧めします(1か所でのみ変更できるように)。

69
japf

this.Resources["mykey"]を使用することもできます。私はそれがあなた自身の提案よりもはるかに良いとは思いません。

23

直接的な答えではありませんが、強く関連しています:

リソースが別のファイルにある場合-ResourceDictionary.xamlなど

x:Classを追加するだけです:

<ResourceDictionary x:Class="Namespace.NewClassName"
                    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml" >
    <ds:MyCollection x:Key="myKey" x:Name="myName" />
</ResourceDictionary>

次に、コードビハインドで使用します。

var res = new Namespace.NewClassName();
var col = res["myKey"];
17
itsho

他のクラス(xamlコードビハインドではないなど)からリソースにアクセスする場合は、次を使用できます。

Application.Current.Resources["resourceName"];

System.Windows名前空間から。

3
R. Matveev

次のようなリソースキーを使用できます。

<UserControl.Resources>
    <SolidColorBrush x:Key="{x:Static local:Foo.MyKey}">Blue</SolidColorBrush>
</UserControl.Resources>
<Grid Background="{StaticResource {x:Static local:Foo.MyKey}}" />
public partial class Foo : UserControl
{
    public Foo()
    {
        InitializeComponent();
        var brush = (SolidColorBrush)FindResource(MyKey);
    }

    public static ResourceKey MyKey { get; } = CreateResourceKey();

    private static ComponentResourceKey CreateResourceKey([CallerMemberName] string caller = null)
    {
        return new ComponentResourceKey(typeof(Foo), caller); ;
    }
}
3
Johan Larsson