2017-03-09 65 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