私は、UserControlsの一般化されたコンテナとして機能する基本ウィンドウを持っています。幅と高さが子アイテムのサイズによって決定されないように見えることを除いて、期待通りに機能します(幅と高さがautoに設定されていると、私は予想しています)。次のようにベースウィンドウのXAMLは、次のとおりです。ItemsControlにウィンドウの幅と高さを自動的に設定します。
<local:BaseView x:Class="Program.UI.Views.BaseWindowView"
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:Program.UI.Views"
xmlns:converters="clr-namespace:Program.UI.Converters"
xmlns:presenter="clr-namespace:Program.Presenter"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
mc:Ignorable="d"
ResizeMode="NoResize" WindowStyle="None"
d:DesignHeight="300" d:DesignWidth="300" AllowsTransparency="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<presenter:EventToCommand Command="{Binding Mode=OneWay, Path=CloseWindow}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<local:BaseView.Resources>
<ResourceDictionary>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<converters:SystemEventToForegroundColor x:Key="SystemEventToForegroundColor" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Program;component/UI/Templates/Generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</local:BaseView.Resources>
<local:BaseView.Foreground>
<SolidColorBrush Color="Black" Opacity="100"/>
</local:BaseView.Foreground>
<local:BaseView.Background>
<SolidColorBrush Color="White" Opacity="0"/>
</local:BaseView.Background>
<Border BorderBrush="#FF838383" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderThickness="1" Height="auto" Width="auto" Margin="0,0,5,5">
<Canvas Background="#E8F6F6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Width="auto">
<Canvas.Effect>
<DropShadowEffect RenderingBias="Quality" Opacity="0.3" ShadowDepth="3" BlurRadius="4"/>
</Canvas.Effect>
<DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Margin="0,0,0,0" x:Name="ReferenceInfo" Canvas.Left="0" Canvas.Top="0"
Width="{Binding ActualWidth, ElementName=InfoCanvas}"
Height="{Binding ActualHeight, ElementName=InfoCanvas}"
d:DesignWidth="294"
d:DesignHeight="294">
<Grid Width="auto" Height="auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Width="auto" HorizontalAlignment="Stretch" Height="30" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderBrush="#FF838383" BorderThickness="0,0,0,1" Height="30" VerticalAlignment="Top">
<Label Style="{StaticResource WindowHeaderControlTitle}" MouseDown="Label_MouseDown"/>
</Border>
<Border Grid.Column="1" BorderBrush="#FF838383" BorderThickness="1,0,0,1">
<Label Style="{StaticResource WindowHeaderControlCloseLabel}" MouseEnter="Label_MouseEnter" MouseLeave="Label_MouseLeave" MouseLeftButtonUp="Label_MouseLeftButtonUp" MouseLeftButtonDown="Label_MouseLeftButtonDown" FontSize="14" FontFamily="Segoe UI Black" FontStretch="UltraExpanded" Content="X"/>
</Border>
</Grid>
<ItemsControl Grid.Row="1" Height="auto" Width="auto" ItemsSource="{Binding ChildView}"/>
</Grid>
</DockPanel>
</Canvas>
</Border>
ビューがあるため、Excelのリボンボタンのクリックイベント、コードビハインドで生成されます。
var childView = new DatapointDefinitionsView();
childView.DataContext = new DatapointDefinitionsViewModel();
ApplicationData.Presenter.ShowView<BaseWindowView>(
new BaseWindowViewModel(childView, ApplicationData.Presenter), true);
ShowViewコードは次のとおりです。
private BaseWindowView _windowView;
public void ShowView<T>(BaseWindowViewModel viewModel, bool asModal) where T : BaseWindowView, new()
{
_windowView = new T
{
DataContext = viewModel,
ShowInTaskbar = false,
Title = viewModel.Caption,
};
//Width = viewModel.ChildView[0].Width,
//Height = viewModel.ChildView[0].Height
if (asModal)
{
_windowView.ShowDialog();
_windowView = null;
}
else
{
_windowView.Show();
}
}
子の高さに明示的に幅と高さを設定すると、幅は指定された幅になりますが、高さには影響しません。ただし、値が固定されており、ユーザーコントロールのサイズが変更された場合は更新されないため、これは満足のいく解決策ではありません。
私が欲しいものを達成する別の方法はありますか?
ウィンドウで 'SizeToContent =" WidthAndHeight "'を試しましたか? –
'ResizeMode =" NoResize "'を設定すると、ウィンドウのサイズをどのように変更するのですか? – lokusking
@lokusking 'ResizeMode =" NoResize "'はテスト目的のために設定されました。私は仕事中に何もせずに初期サイズを設定しようとしていました。通常は "CanResize"に設定され、1600x900(測定されていない)のデフォルトサイズのウィンドウを表示します – Sufo