2017-01-23 68 views
0

這種奇怪的事情發生在這裏。我正在使用wpf xaml,並且我創建了一個用戶控件,類似於右上角有圖像的文本框。風格在用戶控制奇怪的行爲

這裏是控制的XAML代碼:

<UserControl x:Class="Stirnradprogramm.Classes.Controls.TextBoxWithImage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Stirnradprogramm.Classes.Controls" 
     x:Name="parent"> 
<Grid DataContext="{Binding ElementName=parent}" Margin="0"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"/> 
     <ColumnDefinition Width="15"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="15"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <TextBox Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" KeyDown="TextBox_KeyDown" ></TextBox> 
    <StackPanel Grid.Column="1" Margin="0,3,3,0"> 
     <Image Grid.Column="1" Margin="0,2,0,0" Grid.Row="0" MouseDown="Image_MouseDown" > 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=State}" Value="true"> 
          <Setter Property="Source" Value="{Binding LockedImgPath}"></Setter> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Path=State}" Value="false"> 
          <Setter Property="Source" Value="{Binding UnlockedImgPath}"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 
    </StackPanel> 
</Grid> 

現在我用它在我的主窗口:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"/> 
     <ColumnDefinition Width="1*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <tbwi:TextBoxWithImage Style="{StaticResource TextBoxWithImageStyle}" Height="27" Margin="3" State="{Binding lockPressed}" Grid.Column="0" Grid.Row="1" /> 
    <TextBox Style="{StaticResource TextBoxStyle}" Grid.Column="1" Grid.Row="1"></TextBox> 
</Grid> 

正如你可以看到,我在這裏使用兩種不同的款式:

<Style TargetType="tbwi:TextBoxWithImage" x:Key="TextBoxWithImageStyle"> 
    <Setter Property="Height" Value="27"></Setter> 
    <Setter Property="Margin" Value="3"></Setter> 
    <Setter Property="VerticalContentAlignment" Value="Center"></Setter> 
</Style> 
<Style TargetType="TextBox" x:Key="TextBoxStyle"> 
    <Setter Property="Height" Value="27"></Setter> 
    <Setter Property="Margin" Value="3"></Setter> 
    <Setter Property="VerticalContentAlignment" Value="Center"></Setter> 
</Style> 

種樣式似乎是相同的,但視覺效果是不同的: enter image description here

,更有趣,當我從我的用戶控件扔掉風格和手工編寫保證金和高度屬性,結果是期待,同樣的尺寸:

<tbwi:TextBoxWithImage Height="27" Margin="3" State="{Binding lockPressed}" Grid.Column="0" Grid.Row="1" /> 

enter image description here

沒有人碰到這樣的行爲嗎?我將不勝感激任何幫助。

回答

1

取出VerticalContentAlignment調節器或設置它的價值在樣式爲Stretch:

<Style TargetType="tbwi:TextBoxWithImage" x:Key="TextBoxWithImageStyle"> 
    <Setter Property="Height" Value="27"></Setter> 
    <Setter Property="Margin" Value="3"></Setter> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter> 
</Style> 

...然後設置文本框的VerticalContentAlignment在用戶控件到中心:

<TextBox Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" VerticalContentAlignment="Center"></TextBox> 

區別在於TextBox伸展以填充可用空間,而如果您將UserControl的VerticalContentAlignment屬性設置爲Stretch以外的其他屬性,則UserControl中的網格不會。

+0

是的,那是我需要的 – MCv