web-dev-qa-db-ja.com

C#で使用できるようにリソースをxamlで定義して使用する方法

理論的には、ブラシや色などをxamlファイルで定義して、c#のbutton.backgroundに割り当てることができると思います。しかし、どうすればよいですか?私のlineargradientbrush定義は次のようにどこに置きますか:

<LinearGradientBrush x:Key="BlaBrush">
                <GradientStop Offset="0" Color="Red"/>
                <GradientStop Offset="1" Color="Green"/>
</LinearGradientBrush>

ウィンドウのxamlファイルのさまざまな場所に配置するだけで、さまざまなエラーメッセージが表示されます:/

私はこの質問をstackoverflowで見つけました: XAMLで定義されたブラシリソースを使用する方法、C#から これはその一部を説明していますが、ブラシの定義をどこで行うか知っているようです。

また、アプリにshinyblue.xaml wpfテンプレートを追加してみて、<ResourceDictionary Source="ShinyBlue.xaml"/>をapp.xamlのapplication.resourcesに追加します。これにより、すべてのボタンが瞬時に青になりますが、それでも、NormalBrushのようなshinyblue.xamlで定義されている「もの」にはC#からアクセスできません。少なくとも、方法はわかりません。

マーク

18
marc40000

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

MainWindow.xaml

<Window x:Class="BrushResource.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Window.Resources>
    <LinearGradientBrush x:Key="BrushOne" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
        <LinearGradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="Black" Offset="0" />
                <GradientStop Color="Silver" Offset="1" />
            </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="BrushTwo" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
        <LinearGradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="Maroon" Offset="0" />
                <GradientStop Color="Silver" Offset="1" />
            </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
</Window.Resources>

<StackPanel>
    <Button Content="Button" Width="100" Click="myButton_Click"/>
</StackPanel>

値を割り当てるには、次のようなリソースからグラデーションブラシを取得する必要があります。

MainWindow.xaml.cs

private void myButton_Click(object sender, RoutedEventArgs e)
    {
        (sender as Button).Background = this.Resources["BrushOne"] as LinearGradientBrush;
    }
18
JSprang

既存の回答では、Window.Resourcesにリソースを配置する方法について説明しています。リソースをアプリケーション全体で利用できるようにしたい場合は、App.xaml以上にリソースを配置することを検討し、ビューに含めて他の場所(他のプロジェクトを含む)で再利用できるスタンドアロンのリソースディクショナリを作成します。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DefaultStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style x:Key="my_style" />
    </ResourceDictionary>
</UserControl.Resources>
16
Brian Genisio

それらをXAMLのいずれかの要素のResourcesコレクションに配置します。

<Window ...>
    <Window.Resources>
        <LinearGradientBrush x:Key="BlaBrush">
            <GradientStop Offset="0" Color="Red"/>
            <GradientStop Offset="1" Color="Green"/>
        </LinearGradientBrush>
        <!-- Other resources -->
    </Window.Resources>
    <!-- Contents of window -->
</Window>

次に FindResource を使用してコードでそれらを取得します

var blaBrush = this.FindResource("BlaBrush") as LinearGradientBrush;

詳細は Resources Overview を参照してください。

13
Quartermeister

次のようにアプリケーションリソースにアクセスできます。

Application.Current.Resources["BlaBrush"] as LinearGradientBrush

または、リソースをコントロールのリソースに追加し、Quartermeisterが書いたようにそれらにアクセスします。

8
Ozan