2013-03-13 97 views
0

這是關於WPF控件定位一個奇怪的行爲。我有一個低於控制,並在設計時間良好對齊。但是運行了按鈕的角落錯位定位奇怪的行爲

<Window x:Class="StackOverflow.LookAndWork" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Tables" Height="388" Width="314" ResizeMode="NoResize" > 
    <Grid> 
     <TextBox Margin="12,12,12,41"></TextBox> 
     <Button Content="OK" Height="23" Margin="205,314,12,12" Name="button3" Width="75" IsCancel="True" IsEnabled="False" /> 

    </Grid> 
</Window> 

設計時捕捉

Design Time

運行時快

Runtime

想如果我刪除了ResizeMode = 「NoResize」從窗口。我可以在運行時看到正確的位置。 ResizeMode =「NoResize」有什麼問題?

Anyhelp將不勝感激!

+1

OT:**不要**使用固定邊距來佈置視圖中的控件!有一堆佈局控件是爲這項工作創建的。我知道你在使用設計師。我強烈建議直接在XAML中進行佈局。如果您想重複使用您的視圖或需求發生變化,您將需要執行大量工作。 – DHN 2013-03-13 10:52:57

+2

這可能與按鈕上方的TextBox有關,因爲它會按步驟(當時的一行)重新調整大小。嘗試啓用窗體的大小調整,然後慢慢調整窗體大小。看看你是否看到了文本框的跳躍。 – 2013-03-13 10:53:01

+0

請使用微軟快速混合4否則設置屬性VerticalAlignment和Horizo​​ntalAlignment – Pranav1688 2013-03-13 10:53:27

回答

2

而不是增加在控制水平之下,你爲什麼不加入電網級的最低保證金?

例子:

<Grid Margin="12,12,12,12"> 

這樣你會得到一個12像素的保證金邊境。 在按鈕上,不要執行硬編碼的左邊距。相反,您可以使用HorizontalAlignment="Right"來完成這項工作。

在一個側面說明,我不太喜歡在網格中添加控件沒有指定Grid.RowDefinitions,Grid.ColumnDefinitions,Grid.Row和Grid.Column。它是Grid的強大工具。

1

我在VisualStudio 2012設計器中看不到相同的問題:http://screencast.com/t/TGVgUyfR 設計時和運行時看起來都是一樣的。所以在設計者的早期版本中應該有一個bug。 不過,我建議你將你的按鈕移動到單獨的網格行或使用另一個佈局控件來組織你的意見。

+0

我試過佈局,但沒有希望,即使它沒有正確對齊 – Smaug 2013-03-13 11:07:47

2

爲了更好看,不使用保證金或尺寸。使用網格定義來分割您的應用程序。

用下面的XAML代碼,您的申請將始終有一個良好的期待:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="23" /> 
    </Grid.RowDefinitions> 
    <TextBox /> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="75" /> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True" IsEnabled="False" /> 
    </Grid> 
</Grid> 

寬度和高度可以在詞典中定義。在這種情況下,在RowDefinition和ColumnDefinition屬性中,使用Auto而不是值。

編輯: 使用Dictionnary像

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Width" Value="75"/> 
     <Setter Property="Height" Value="23"/> 
    </Style> 
</ResourceDictionary> 

然後

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Dictionary1.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TextBox /> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True" IsEnabled="False" /> 
    </Grid> 
</Grid> 
+0

雖然我明白你爲什麼設置託管按鈕的列的寬度,爲什麼你明確地設置高度?該按鈕可以很好地具有其默認高度。 – 2013-03-13 11:03:30

+0

我有編輯。更好的方法是在Dictionnary中定義公共控件(按鈕)的寬度和高度,然後將定義的高度和寬度設置爲「自動」 – Xaruth 2013-03-13 11:05:16

+0

這再次將該按鈕的高度固定爲23像素,僅在另一個位置。順便說一下:就像你做的那樣,整個應用程序中的所有按鈕都是75x23像素,對吧? – 2013-03-13 11:52:01

1

爲了延長Xaruth的回答,我沒有確定按鈕行的高度,而是有它使用默認的高度。同樣的寬度,我會按鈕定義。

另外請注意,我給該按鈕的餘量。不固定網格列/行大小的附加獎勵它現在行高度也考慮了餘量:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBox /> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 

     <Button Grid.Column="1" Content="OK" Name="button3" IsCancel="True" IsEnabled="False" Width="75" Margin="0,8,0,0" /> 
    </Grid> 
</Grid>