2017-03-09 83 views
0

我上週制定的大小會啓動了「廣」 MainWaindow(大於1400個像素)新WPF應用程序B主窗口與先前開發的應用程序A主窗口

我在目前的時間啓動一個應用程序A開發一個新的應用程序B(它尋找運行Excel實例)

所以我有一個視圖,其中包含一個DataGrid,其Width屬性Auto(設計器圖片如下)。一切都很好

enter image description here

然後我把它插入到主窗口(這裏設計圖片)

Datagrid View Designer picture

這是不是正是我的預期,但我還是不得不在SO一些研究這樣的問題wpf-datagrid-why-the-extra-column(答案告訴它不是一個額外的列它是一個補充寬度...)

然後我運行這個應用程序B。奇蹟:我得到了更廣闊的窗戶。

enter image description here

確切的問題,我想在這裏揭露的是:

  • 爲什麼我會在應用B相同的寬度爲上週的申請A的一個運行時?

我不相信巧合(我也沒有複製/粘貼2個應用程序之間)。它在哪裏支持? 我已閱讀關於樣式的文章(默認樣式,專用於不適用於繼承MainWindow的窗口樣式...)

閱讀關於WPF的任何(實際)基本原理也值得歡迎!

編輯:添加代碼(我第一次沒有想顯示的代碼專注於問題,因爲有「千」的地方,你可以設置一個寬度...生效與否。)

<UserControl ... 
      d:DataContext="{d:DesignInstance {x:Type vm_nmspc:MainWindowVm}, IsDesignTimeCreatable=True}"> 


    <UserControl.Resources> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="Width" Value="Auto"/> 
      ... 
     </Style> 
    </UserControl.Resources> 

    <Grid> 
     <DataGrid ItemsSource="{Binding OpenExcelColl}" AutoGenerateColumns="False" AlternationCount="{Binding OpenExcelColl.Count}" 
        VirtualizingPanel.IsVirtualizing="False" CanUserAddRows="False" SelectedItem="{Binding SelectedExcelObject}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Path" Binding="{Binding CompletePath}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Type" Binding="{Binding ExtType}" IsReadOnly="True"/> 
      </DataGrid.Columns> 
      ... 
     </DataGrid> 
    </Grid> 

</UserControl> 

而且MainWindow.xaml(注意,沒有寬度已獲得,希望主窗口會自動適應。Width="Auto"沒有工作)

<Window ... 
    DataContext="{DynamicResource ResourceKey=MyVM}" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" 
    SizeToContent="Width"> <<------- Line added to "workaround/solve" the problem 


    <Window.Resources> 
     <vm_nmspc:MainWindowVm x:Key="MyVM"/> 
    </Window.Resources> 

    <Grid> 
     <views:AllExcelObjDataGrid DataContext="{Binding}"/> 
    </Grid> 
</Window> 

後SizeToContent =「寬度」

enter image description here

+0

我想我找到了答案的開始[爲什麼是我的wpf窗口大小默認將是巨大](http://stackoverflow.com/questions/3146106/),至少通過將* SizeToContent =「Width」*添加到Window屬性。 – NGI

+0

發佈一些Xaml代碼,可能發生這種情況是因爲您將寬度設置爲auto,因此它將佔用從其父級獲得的任何空間。在你的Datagrid中設置'ColumnWidth =「*」'來平分你的列之間的剩餘空間。 – SilentStorm

+0

你的問題到底是什麼?預期的結果是什麼? – mm8

回答

2

這裏的問題是,您將寬度設置爲auto,這意味着它將從其父項獲取所有可用空間。

如果我查看可視化樹,沒有設置其他寬度,所以你的數據網格將延伸到整個應用程序。

應用程序B在應用程序A調試中調用完全相同的空間的原因是因爲Windows實際上認爲這些應用程序是相同的應用程序,因爲它們都是使用vshost啓動的。現在

,您可以在父設置你的寬度,我更喜歡這樣的事情:

<Window... 
Width="1366" 
MinWidth="{Binding Source={x:Static SystemParameters.FullPrimaryScreenWidth}, Converter={StaticResource ScreenSizeConverter}}" 

您的數據網格仍將延到整個應用程序,如果你想創造空間除去寬度=自動二傳手在左邊或右邊放置一些額外的控件。

現在,將靜態寬度應用於您的數據網格,或使用網格將您的數據網格包裹進來,並使用動態寬度在列中進行分割。例如:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="200"/> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <DataGrid Grid.Column="0" ItemsSource="{Binding OpenExcelColl}" AutoGenerateColumns="False" AlternationCount="{Binding OpenExcelColl.Count}" 
       VirtualizingPanel.IsVirtualizing="False" CanUserAddRows="False" SelectedItem="{Binding SelectedExcelObject}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Path" Binding="{Binding CompletePath}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Type" Binding="{Binding ExtType}" IsReadOnly="True"/> 
     </DataGrid.Columns> 
     ... 
    </DataGrid> 

    <StackPanel Grid.Column="1"> 
     <!-- Additional controls here --> 
    </StackPanel> 
</Grid> 

如果你仍然有你想擺脫掉用一個白色的小空間

<DataGrid ColumnWidth="*" ... 

這要分剩下的列之間的空間。

編輯

你並不真的需要sreensizeconverter,你可以設置一個靜態的數字,這是一個快速和骯髒的執行設置父窗口minwidth,爲了您的方便:

public class ScreenSizeConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value.GetType() == typeof(double)) 
     { 
      return (((double)value/4) * 3); 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

在App.xaml中(Window.Resources應該可以工作,但我認爲你忘記了ResourceDictionary,這就是爲什麼它不能編譯,我更喜歡App.xaml,因爲現在你只需要導入它一次,而且你可以跨所有窗口和用戶控件使用):

<Application x:Class="MecamApplication.Client.App" 
     ... 
     xmlns:Converters="clr-namespace:MecamApplication.Core.Converters;assembly=MecamApplication.Core"> 


<Application.Resources> 
    <ResourceDictionary> 
     <Converters:ScreenSizeConverter x:Key="ScreenSizeConverter"/> 
    </ResourceDictionary> 
</Application.Resources> 

不過,你可以設置minwidth =「500」和width =「950」,你也可以達到同樣的效果,我忘了清除那部分。

+0

感謝您的回答。在開發初期(只有內部應用程序,而不是AAA商業應用程序),我寧願將所有東西都自動化(我稍後會修復一些固定大小)。窗口的維度是一個相當困難的主題(我可以通過200,200 *,Auto,Horizo​​ntalAlignment =「Stretch」得到多少相關組合......),這就是爲什麼我也在尋找所有這些背後的「理性」/邏輯。仍然必須全面測試您的所有選項。 – NGI

+0

你可以多展示一下你的XAML嗎?我有一個小問題。我定義了一個在中實例化的轉換器類,但之後我得到一個異常,因爲* StaticResource ScreenSizeConverter *行在* *行之前,並且此時不創建轉換器。我正在閱讀關於該主題的帖子,如[wpf-window-title-from-static-resource](http://stackoverflow.com/questions/19840044)...由於綁定,DynamicResource似乎不可用... – NGI

+0

我設法通過在資源下方聲明MinWidth屬性 ... 。感謝您的編輯(我以爲我會收到通知,但目前我什麼也沒看到) – NGI