5

ユーザーコントロールをロードするときに、で定義されているスタイルを動的に設定しようとしていApp.xamlますが、何らかの理由でスタイルが適用されていません(つまり、エラーが発生していない、スタイルが適用されていないだけです)。

バインディングを間違って定義したためだと確信していますが、それを機能させるために別の方法で何をする必要があるのか​​理解できません。

App.xamlスタイル

私がRunningTitleBlock求めているスタイルはであり、以下のコードサンプルに含まれている他のいくつかのスタイルで構成されています。

<Style TargetType="Label">
    <Setter Property="Margin" Value="4"/>
</Style>

<Style TargetType="Label"
       BasedOn="{StaticResource {x:Type Label}}"
       x:Key="HeaderBlock">
    <Setter Property="FontSize" Value="16"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Foreground" Value="White"/>
</Style>

<Style TargetType="Label"
       BasedOn="{StaticResource ResourceKey=HeaderBlock}"
       x:Key="TitleBlock">
    <Setter Property="Foreground" Value="Black"/>
</Style>

<Style TargetType="Label"
       BasedOn="{StaticResource ResourceKey=TitleBlock}"
       x:Key="RunningTitleBlock">
    <Setter Property="Background">
        <Setter.Value>
            <LinearGradientBrush StartPoint="0.0, 0.5"
                                 EndPoint="1.0, 0.5">
                <GradientStop Color="White" Offset="0.0"/>
                <GradientStop Color="Green" Offset="1.0"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
</Style>

ユーザーコントロールのバインド

Binding値コンバーターから返された値にバインドしようとしています。

Style="{DynamicResource ResourceKey={Binding Path=MonitoringType, Converter={StaticResource TSConverter}}}"

コード

MonitoringTypes列挙型

public enum MonitoringTypes
{
    Running,
    Failed,
    Paused,
    Favorites,
}

ユーザーコントロール

ここで私がやろうとしているMonitoringTypesのは、渡された列挙値の文字列値をいくつかのよく知られたテキストと連結して、に存在するスタイル名を作成することApp.xamlです。値コンバーターが呼び出され正しい値が返されますが、何らかの理由でスタイルが適用されていません。

/// <summary>
/// Interaction logic for MonitorWorkflow.xaml
/// </summary>
public partial class MonitorWorkflow : UserControl
{
    public MonitorWorkflow(MonitoringTypes monitoringType)
    {
        InitializeComponent();

        this.DataContext = new MonitorWorkflowViewModel { MonitoringType = monitoringType };
    }
}

public class MonitorWorkflowViewModel
{
    public MonitoringTypes MonitoringType { get; set; }
}

public class TitleStyleValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var type = (MonitoringTypes)value;
        return string.Format("{0}TitleBlock", Enum.GetName(typeof(MonitoringTypes), type));
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0, value.ToString().IndexOf("TitleBlock")));
    }
}
4

2 に答える 2

6

私の提案は、DynamicResourceステートメントをスキップし、直接Converter提供を使用することです。Style

Style="{Binding Path=MonitoringType, Converter={StaticResource TSConverter}}"

では、文字列ではなくTSConverterを返すことができます。Styleこのようなもの:

public class TitleStyleValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        System.Globalization.CultureInfo culture)
    {
        var type = (MonitoringTypes)value;
        var styleToReturn = FindResource(
            string.Format("{0}TitleBlock", 
                Enum.GetName(typeof(MonitoringTypes), type)));
        if (styleToReturn != null)
            return (Style)styleToReturn;
        else 
            return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        // not sure if you need this anymore... 
        return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0,
           value.ToString().IndexOf("TitleBlock")));
    }
}

これは私がしたことですが、代わりに次のコードを使用します。あなたが答えている間、私は実際に私自身の質問に答えました。良いタイミング!

public class TitleStyleValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var type = (MonitoringTypes)value;
        return App.Current.Resources[string.Format("{0}TitleBlock", Enum.GetName(typeof(MonitoringTypes), type))];
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0, value.ToString().IndexOf("TitleBlock")));
    }
}
于 2012-08-22T17:00:52.710 に答える
1
public static Style DayModeButton = null; 

void loadStyle() 
{
Uri uri1 = new Uri("/Resources/ButtonStyle.xaml", UriKind.Relative);
                ResourceDictionary resDict1 = Application.LoadComponent(uri1) as ResourceDictionary;

foreach (object obj in resDict1.Values) //Set explicit reference
     if (obj is Style) DayModeButton = (Style)obj;
}



[ValueConversion(typeof(object), typeof(Style))]
public class GetStyleConverter: IValueConverter
{
         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
         {
               return DayModeButton ; 
         }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
         {
             return 0;
         }
}
于 2012-08-22T17:36:21.183 に答える