在 ResourceDictionary 文件中使用 viewbox

3
我有一个ResourceFile1.xaml文件,它的内容是:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Viewbox x:Key="Flash-On" >
    <Grid  Width="256" Height="256" Visibility="Visible">
        <Path Tag="Icon" Data="F1M376.251,632.755L385.665,632.755 381.302,646.07 394.618,646.07 389.11,660.302 393.01,660.302 381.531,672.93 377.398,660.763 381.073,660.763 383.829,652.268 369.825,652.268 376.251,632.755z" Stretch="Uniform" Fill="#FFFFFFFF" Width="176" Height="176" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5">
            <Path.RenderTransform>
                <TransformGroup>
                    <TransformGroup.Children>
                        <RotateTransform Angle="0" />
                        <ScaleTransform ScaleX="1" ScaleY="1" />
                    </TransformGroup.Children>
                </TransformGroup>
            </Path.RenderTransform>
        </Path>
    </Grid>
</Viewbox>


<Viewbox x:Key="Flash-Off">
            ....
</Viewbox>
</ResourceDictionary>

PhoneAppplicationPage的代码

    <phone:PhoneApplicationPage.Resources>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ResourceFile1.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</phone:PhoneApplicationPage.Resources>

但是这些代码不起作用。 设计师错误:InvalidOperationException:元素已经是另一个元素的子元素。 此外,如果我使用类似的代码 <Button Content="{StaticResource Flash-On}"/> ,则出现运行时错误:无法分配到属性 'System.Windows.Controls.ContentControl.Content'。 如果在Grid.Resources中使用Viewbox,则没有问题,可以正常工作,但我想与ResourceDictionary一起使用。我该怎么做?

1个回答

6

因为 Silverlight 资源字典 中的所有内容都必须可共享。在 WPF 中,您可以在资源字典中的对象上使用 x:Shared 属性,以强制 WPF 为每个资源检索创建一个新实例。 为了避免这种情况发生在 Silverlight 中,您可以创建一个 DataTemplate

<DataTemplate x:Key="ButtonTemplate">
    <Viewbox>
<!-- Here your content-->
    </Viewbox>
</DataTemplate>

<Button ContentTemplate="{StaticResource ButtonTemplate}"/>

更新 0

我编写了一个示例,根据 CheckBox 的值更改模板。

用于更改模板的转换器:

public class TemplateSelectorConverter : IValueConverter
{
    public DataTemplate TrueTemplate { get; set; }

    public DataTemplate FalseTemplate { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (((bool) value))
            return TrueTemplate;
        return FalseTemplate;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

资源:

<DataTemplate x:Key="FirstTemplate">
    <TextBox Text="FirstTemplate" />
</DataTemplate>

<DataTemplate x:Key="SecondTemplate">
    <TextBox Text="SecondTemplate" />
</DataTemplate>

<internal:TemplateSelectorConverter x:Key="TemplateSelector" TrueTemplate="{StaticResource FirstTemplate}"
                                    FalseTemplate="{StaticResource SecondTemplate}" />

Xaml标记:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="30" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <CheckBox Name="CheckBox"/>
    <Button Grid.Column="1"
            ContentTemplate="{Binding Path=IsChecked, ElementName=CheckBox, Converter={StaticResource TemplateSelector}}"
            VerticalAlignment="Top" />
</Grid>

我希望这有所帮助。


感谢,它可以正常工作,但不能与转换器类一起使用。如何与转换器类一起使用? - Oguzhan
你试过这样写吗:<Button ContentTemplate="{Binding Path=TheValueOfWhichDependsTheTemplate, Converter={StaticResource ConverterThatReturnsTheTemplateUsingValue}}"/> - Vyacheslav Volkov
更改模板时您使用的是什么值? - Vyacheslav Volkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接