WPF初学者 - 一个简单的XAML布局无法正常工作

时间:2010-03-25 04:42:43

标签: wpf grid

我刚开始学习WPF,并按照一本书在XAML中制作了这个示例计算器应用程序。 XAML代码附在下面。 我在xaml.cs文件中没有任何特定于UI的代码。

但是,我发现设计时和运行时之间存在差异。正如您在附件screenshot中看到的那样,计算器的左上角按钮比其余部分大。

更令人困惑的是,设计师在编辑XAML时正确显示了按钮。

我试图确定为什么会这样,而且我很难过。有人可以帮忙吗?

我正在使用VS2008,目标框架3.5,如果它有任何帮助。

这是XAML:

<Window x:Class="TestWpf2008.Calculator"

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:TestWpf2008"
  Title="Calculator" FontFamily="Calibri" FontSize="15"   
  SizeToContent="WidthAndHeight" Loaded="Window_Loaded">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml"/>
            <ResourceDictionary>
                <SolidColorBrush x:Key="MyTitleColor" Color="Chocolate" />
                <Style TargetType="Button">
                    <Setter Property="Margin" Value="6"/>
                </Style>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid Background="{StaticResource PrettyBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" FontSize="24" 
               Name="Header"
               VerticalAlignment="Center" HorizontalAlignment="Center">Calculator</TextBlock>
    <TextBox Grid.ColumnSpan="4" Grid.Column="0" Grid.Row="1" Name="Display" 
             HorizontalContentAlignment="Left" Margin="5" />
    <Button Grid.Row="2" Grid.Column="0" Click="Button_Click">7</Button>
    <Button Grid.Row="2" Grid.Column="1" Click="Button_Click">8</Button>
    <Button Grid.Row="2" Grid.Column="2" Click="Button_Click">9</Button>

    <Button Grid.Row="3" Grid.Column="0" Click="Button_Click">4</Button>
    <Button Grid.Row="3" Grid.Column="1" Click="Button_Click">5</Button>
    <Button Grid.Column="2" Grid.Row="3" Click="Button_Click">6</Button>

    <Button Grid.Row="4" Grid.Column="0" Click="Button_Click">1</Button>
    <Button Grid.Row="4" Grid.Column="1" Click="Button_Click">2</Button>
    <Button Grid.Row="4" Grid.Column="2" Click="Button_Click">3</Button>


    <Button Grid.Row="5" Grid.Column="0" Click="Button_Click">0</Button>

    <Button Grid.Row="5" Grid.Column="3" Tag="{x:Static local:Operation.PLUS}" 
            Click="Op_Click">+</Button>
    <Button Grid.Row="4" Grid.Column="3" Tag="{x:Static local:Operation.MINUS}"
            Click="Op_Click">-</Button>
    <Button Grid.Row="3" Grid.Column="3" Tag="{x:Static local:Operation.TIMES}"
            Click="Op_Click">*</Button>
    <Button Grid.Row="2" Grid.Column="3" Tag="{x:Static local:Operation.DIVIDE}"
            Click="Op_Click">/</Button>

    <Button Grid.Row="5" Grid.Column="1" >.</Button>
    <Button Grid.Row="5" Grid.Column="2" Tag="{x:Static local:Operation.EQUALS}"
            Click="Op_Click">=</Button>

</Grid> </Window>

1 个答案:

答案 0 :(得分:0)

来自MSDN

  

在指定为合并字典的ResourceDictionary中定义资源是合法的,或者作为指定Source的替代方法,或者除了指定源中包含的任何资源之外。但是,这不是常见的情况;合并字典的主要方案是合并外部文件位置的资源。如果要在页面的标记中指定资源,通常应在主ResourceDictionary中定义这些资源,而不是在合并的字典中定义。

所以你只需要从合并的resourcedictionary

中移出样式

但我建议您

移动

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="Dictionary1.xaml"/>
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

到App.xaml中的Application.Resources

保持

<Style TargetType="Button"> 
    <Setter Property="Margin" Value="6"/> 
</Style>
Window.Resources中的

因为您可以使用合并的资源限制来解决这个问题,因为“Dictionary1.xaml”的项目之间很容易重用