ResourceDictionary中的样式阻止了所有其他功能

时间:2012-05-10 01:11:01

标签: xaml windows-phone-7.1

UPDATE :我将TextBox的样式移动到手机:PhoneApplicationPage.Resources标签,它的行为方式完全相同,所以事实证明这不是我使用ResourceDictionary的原因问题,但我定义风格的方式有问题。

我刚刚开始使用ResourceDictionaries,我非常喜欢它们,但当我尝试在我的应用程序中使用它们时,一切都停止了。

首先是以下TextBox:

<TextBox Grid.Column="1" 
  Grid.Row="0"
  x:Name="Value" 
  InputScope="Number"
  TextAlignment="Right"
  TextChanged="OnValueTextChanged">
  <TextBox.Style>
      <StaticResource ResourceKey="InputTextBox" />
  </TextBox.Style>
 </TextBox>

更新:我已根据XAMeLi的答案更新了ResourceDictionary,现在我看到了边框,但看起来TextBox没有任何背景但是,当我点击它时没有任何反应就好像TextBox甚至没有。然后通过纯粹的运气,我注意到如果我点击底部边框,数字键盘会弹出,好像TextBox太小或隐藏在border元素下面。我尝试修改TextBox高度无济于事。这让我发疯了。

然后ListPickers更糟糕:

<toolkit:ListPicker 
  Grid.Column="0" 
  Grid.ColumnSpan="2" 
  Grid.Row="1"
   x:Name="CategoriesPicker"
   HeaderTemplate="{StaticResource ListPickerHeaderTemplate}"
   FullModeItemTemplate="{StaticResource CategoriesPickerTemplate}"
   ExpansionMode="FullScreenOnly"
   BorderThickness="0"
   Padding="0"
   Margin="0"
   SelectionChanged="OnCategoriesPickerSelectionChanged">
   <toolkit:ListPicker.Style>
      <StaticResource ResourceKey="ListPickersStyle"/>
   </toolkit:ListPicker.Style>
</toolkit:ListPicker>

当样式进入时,它甚至不会绑定我给它的数据。

带有ResourceDictionary的文件如下所示:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit">
    <Style x:Name="InputTextBox" TargetType="TextBox">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Margin" Value="-12"/>
    <Setter Property="Height" Value="50"/>
    <Setter Property="Background">
        <Setter.Value>
            <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                <GradientStop Color="DarkGray" Offset="0"/>
                <GradientStop Color="DarkGray" Offset=".3"/>
                <GradientStop Color="LightSlateGray" Offset="1"/>
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Border
                            BorderThickness="2"   
                            Margin="15"
                            CornerRadius="3">
                        <Border.BorderBrush>
                            <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                                <GradientStop Offset="0" Color="DarkGray"></GradientStop>
                                <GradientStop Offset="0.3" Color="DarkGray"></GradientStop>
                                <GradientStop Offset="1" Color="LightSlateGray"></GradientStop>
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        <Border
                            BorderThickness="2"
                            CornerRadius="3">
                            <Border.BorderBrush>
                                <LinearGradientBrush StartPoint="1 1" EndPoint="1 0">
                                    <GradientStop Offset="1" Color="Gray"></GradientStop>
                                    <GradientStop Offset="0.3" Color="DarkGray"></GradientStop>
                                    <GradientStop Offset="0" Color="DarkGray"></GradientStop>
                                </LinearGradientBrush>
                            </Border.BorderBrush>

                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Name="ListPickersStyle" TargetType="toolkit:ListPicker">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="toolkit:ListPicker">
                    <Border 
                        BorderThickness="2"
                        Padding="0"
                        Margin="10"                        
                        CornerRadius="3"
                        Background="DarkGray">
                        <Border.BorderBrush>
                            <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                                <GradientStop Offset="0" Color="DarkGray"></GradientStop>
                                <GradientStop Offset="0.3" Color="DarkGray"></GradientStop>
                                <GradientStop Offset="1" Color="LightSlateGray"></GradientStop>
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        <Border BorderThickness="2"
                            CornerRadius="3">
                            <Border.BorderBrush>
                                <LinearGradientBrush StartPoint="1 1" EndPoint="1 0">
                                    <GradientStop Offset="1" Color="Gray"></GradientStop>
                                    <GradientStop Offset="0.3" Color="DarkGray"></GradientStop>
                                    <GradientStop Offset="0" Color="DarkGray"></GradientStop>
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                            <toolkit:ListPicker
                                BorderThickness="0"
                                Padding="0"
                                Margin="0">
                                <toolkit:ListPicker.Background>
                                    <LinearGradientBrush StartPoint="0 0" EndPoint="0 1">
                                        <GradientStop Offset="0" Color="DarkGray"></GradientStop>
                                        <GradientStop Offset="0.5" Color="DarkGray"></GradientStop>
                                        <GradientStop Offset="1" Color="LightSlateGray"></GradientStop>
                                    </LinearGradientBrush>
                                </toolkit:ListPicker.Background>
                            </toolkit:ListPicker>
                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

请有人向我解释我做错了什么。

3 个答案:

答案 0 :(得分:1)

ControlTemplate内,有自己的控件,即文本框的控件模板持有TextBox。这不是应该如何使用控件模板。使用Blend或VS11为每个控件提取默认样式(我建议在新的清洁解决方案中使用它),然后更改视觉外观。

答案 1 :(得分:0)

您应该能够像任何其他属性一样引用该样式,例如:

<TextBox Style="{StaticResource InputTextBox}"/>

首先尝试设置样式,然后尝试设置要覆盖的任何设置,例如:

<TextBox Style="{StaticResource InputTextBox}" TextAlignment="Right" />

答案 2 :(得分:0)

您应该在x:Name中使用x:Key代替ResourceDictionary

  

x:Key和x:名称不是相同的概念。 x:密钥专用   在资源词典中。 x:名称用于XAML的所有区域。一个   使用键值的FindName调用将不会检索键控资源。   但是,Silverlight 5可以使用x:Name(或Name)属性作为   如果没有x:Key,则替换资源项的资源键   项目

只要Windows Phone远离Silverlight 5,就不能在字典中使用x:Name。