属性内容只能设置一次

时间:2017-09-04 10:44:15

标签: c# wpf

我从wpf开始,我想使用静态资源,当我添加标签时我得到一个错误:属性Content只能设置一次,现在当我在stackoverflow上搜索时我明白了窗口标签只能有一个子元素,事情就在书上我读取静态资源标签就在网格标签之上,这是怎么回事?这是我的代码:

<Window x:Class="BaseBallSimulator.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibilit/2006"
        xmlns:local="clr-namespace:BaseBallSimulator"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" >
    <StaticResource></StaticResource>
    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="245*"/>
        <ColumnDefinition Width="272*"/>
    </Grid.ColumnDefinitions>      
        <StackPanel>
        <StackPanel Margin="10">
            <TextBlock Text="Trajectory"></TextBlock>
            <TextBox Name="TrajectoryTextBox" Text="0" Margin="0,5,0,0" Height="20"></TextBox>
        </StackPanel>
        <StackPanel Margin="10">
            <TextBlock Text="Distance"></TextBlock>
            <TextBox Name="DistanceTextBox" Text="0" Margin="0,5,0,0" Height="20"></TextBox>
        </StackPanel>
        <Button Name="PlayButton" Content="PRESS To PLAY" Margin="10" Click="PlayButton_Click"  ></Button>
    </StackPanel>
   <StackPanel Grid.Column="1">
        <StackPanel Margin="5">
            <TextBlock Text="Pitcher Says" Margin="5"/>
            <ListView x:Name="PitcherSaysListView" Margin="5" Height="110" />
        </StackPanel>
        <StackPanel Margin="5,0,5,5">
            <TextBlock Text="Fan Says" Margin="5"/>
            <ListView x:Name="FanSaysListView" Margin="5" Height="110" />
        </StackPanel>
    </StackPanel>
</Grid>
</Window>

2 个答案:

答案 0 :(得分:1)

删除<StaticResource></StaticResource>,您的代码将被编译。

应在<Window.Resources>

中添加所有资源
<Window ...>
    <Window.Resources>
        <SolidColorBrush x:Key="brush" Color="Red" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="245*"/>
            <ColumnDefinition Width="272*"/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <StackPanel Margin="10">
                <TextBlock Text="Trajectory"></TextBlock>
                <TextBox Name="TrajectoryTextBox" Text="0" Margin="0,5,0,0" Height="20"></TextBox>
            </StackPanel>
            <StackPanel Margin="10">
                <TextBlock Text="Distance"></TextBlock>
                <TextBox Name="DistanceTextBox" Text="0" Margin="0,5,0,0" Height="20"></TextBox>
            </StackPanel>
            <Button Name="PlayButton" Content="PRESS To PLAY" Margin="10"  ></Button>
        </StackPanel>
        <StackPanel Grid.Column="1">
            <StackPanel Margin="5">
                <TextBlock Text="Pitcher Says" Margin="5"/>
                <ListView x:Name="PitcherSaysListView" Margin="5" Height="110" />
            </StackPanel>
            <StackPanel Margin="5,0,5,5">
                <TextBlock Text="Fan Says" Margin="5"/>
                <ListView x:Name="FanSaysListView" Margin="5" Height="110" />
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

虽然定义一个空的<StaticResource>元素没有任何意义。

答案 1 :(得分:0)

静态(以及动态)资源通过所谓的资源字典进行管理。您可以添加显式的resourcedictionary文件并在某处引用它。

此外,XAML中的每个UIElement都可以拥有自己的一组资源(静态和动态)。静态和动态资源的定义方式完全相同,区别在于如何分配它们。

例如,您可以使用

为整个窗口创建颜色资源
<Window [...]>
    <Window.Resources>
        <SolidColorBrush x:Key="myColor">Blue</Color>
    </Window.Resources>
</Window>

资源标记内定义的资源只能由元素本身和任何子元素显示。 x:Key - 属性为资源提供了一个名称,您可以使用该名称来引用它。然后,您可以使用

来使用资源
<Grid Background="{StaticResource myColor}"/>

此外,您可以定义以静态方式使用资源还是使用动态资源(使用DynamicResource)。然后,您可以使用之前设置的密钥来访问您的资源。

如果要更改特定控件的外观,例如它的字体大小,边距和颜色,您可以使用所谓的样式,而不是以繁琐的方式分配每个属性。样式的定义与普通资源的定义完全相同

<Window.Resources>
    <Style x:Key="MyTextBlock" TargetType="TextBlock">
        <Setter Property="FontSize" Value="28"/>
        <Setter Property="Background" Value="Red"/>
        <Setter Property="Margin" Value="5"/>
    </Style>
</Window.Resources>

注意两件事:除x:Key - 属性外,我们还指定了TargetType - 属性来告诉VisualStudio我们希望更改哪个元素。其次,我们使用Setters来改变该元素的特定属性。要将样式应用于控件,只需使用

即可使用它
<TextBlock Style="{StaticResource MyTextBlock}">My styled Textblock</TextBlock>

奖励:使用样式时,您可以省略x:Key - 属性。这将自动将样式应用于TargetType类型的所有子控件。