0

更新:我将 TextBox 的样式移到 phone:PhoneApplicationPage.Resources 标记,它的行为方式完全相同,所以事实证明,我使用 ResourceDictionary 不是导致问题的原因,而是有问题我定义风格的方式。

我刚开始玩 ResourceDictionaries,我真的很喜欢它们,但是当我尝试在我的应用程序上使用它们时,一切都停止了工作。

首先是以下文本框:

<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 太小或隐藏在边框元素下方。我尝试修改 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>

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

4

3 回答 3

1

在你ControlTemplate的 s 里面有它们自己的控件,即文本框的控件模板包含一个TextBox. 这不是控件模板的使用方式。使用 Blend 或 VS11 为每个控件提取默认样式(我建议在新的干净解决方案中进行),然后更改视觉外观。

于 2012-05-10T03:15:00.997 回答
0

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

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

并尝试先设置您的样式,然后再设置您想要覆盖的任何设置,例如:

<TextBox Style="{StaticResource InputTextBox}" TextAlignment="Right" />
于 2012-05-10T01:18:02.867 回答
0

您应该使用x:Key而不是x:Namein ResourceDictionary

x:Key 和 x:Name 不是相同的概念。x:Key 专门用于资源字典。x:Name 用于 XAML 的所有区域。使用键值的 FindName 调用不会检索键控资源。但是,如果资源项上不存在 x:Key,Silverlight 5 可以使用 x:Name(或 Name)属性作为资源项的替代资源键。

并且一旦 Windows Phone 远离 Silverlight 5,您就不能在字典中使用 x:Name。

于 2012-05-10T08:43:01.373 回答