2012-05-10 27 views
0

UPDATE:我將TextBox的樣式移動到了Phone:PhoneApplicationPage.Resources標記,它的行爲方式完全相同,所以事實證明我並不使用ResourceDictionary是什麼導致了問題,但是我定義樣式的方式有些問題。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的答案的資源字典,現在我看到的邊界,但它似乎作爲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 
    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> 

請,有人向我解釋什麼,我做錯了。

+0

當您通過Expression Blend創建用於TextBox的模板的副本時,它包含比您提供的更多的細節,您是否剝離了它?你是否已經剝離了ListPicker的Style? –

+0

@PaulDiston:我沒有使用Expression Blend。我最初在Main.xaml頁面中編寫了XAML,並且工作得很漂亮。當我閱讀資源字典時,由於我在幾個控件中使用了相同的樣式,所以我把它拿出來,嘗試一下,然後停止工作。 –

回答

1

在你的ControlTemplate裏面有自己的控件,也就是說文本框的控件模板持有TextBox。這不是應該如何使用控制模板。使用混合或VS11提取每個控件的默認樣式(我建議在一個新的乾淨的解決方案中做),然後改變視覺外觀。

+0

謝謝,這似乎是在正確的軌道上。我已經更新了字典和從現在起的問題有一個不同的問題,TextBox似乎不在那裏。 –

0

你應該能夠引用樣式就像任何其他的屬性,如:

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

並嘗試第一次設置你的風格,那麼你想要的任何設置覆蓋,如:

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

是的,我可以,但不會改變任何事情。對齊方式和InputScope屬性沒有任何作用。 –

0

你應該ResourceDictionary使用x:Key代替x:Name

X:鍵和X:名稱是不相同的概念。 x:密鑰在資源字典中專用 。 x:名稱用於XAML的所有區域。 A 使用鍵值的FindName調用不會檢索鍵控資源。 但是,如果 項目上不存在x:Key,則Silverlight 5可以使用x:Name(或Name)屬性作爲 替代資源項的資源項。

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

相關問題