Значение второго размера изменяется после Loaded
У меня есть простой шаблон MVVM, где у меня есть ViewModel и View (только 2 проблемы в этом случае):
ViewModel:
public class LoginWindowViewModel : Bases.ViewModelBase
{
private double _width = 400;
public double Width
{
get { return _width; }
set { SetProperty(ref _width, value); }
}
private double _height = 500;
public double Height
{
get { return _height; }
set { SetProperty(ref _height, value); }
}
private BitmapImage _backgroundImage = null;
public BitmapImage BackgroundImage
{
get
{
if (_backgroundImage == null) _backgroundImage = Model.Imagining.GetRandomImage((int)Width, (int)Height);
return _backgroundImage;
}
}
}
Посмотреть:
public partial class LoginWindow : Window
{
public LoginWindowViewModel ViewModel
{
get { return (LoginWindowViewModel)DataContext; }
}
public LoginWindow()
{
InitializeComponent();
}
private void mainWindow_Loaded(object sender, RoutedEventArgs e)
{
Open();
}
public void Open()
{
Open(Settings.Default.AnimationDuration);
}
public void Open(Duration animDuration)
{
UpdateLayout();
mainWindow.Clip = new EllipseGeometry(new Point(mainWindow.Width / 2, mainWindow.Height / 2), 0, 0);
double radius = MathFunctions.CalculatePitagoras(mainWindow.Width, mainWindow.Height) / 2;
Animations.RadiusXAnimation((EllipseGeometry)mainWindow.Clip, radius, animDuration);
Animations.RadiusYAnimation((EllipseGeometry)mainWindow.Clip, radius, animDuration);
}
}
Посмотреть XAML:
<Window x:Name="mainWindow" x:Class="Gestionale.View.LoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Gestionale.View"
xmlns:viewModels="clr-namespace:Gestionale.ViewModel"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
Style="{DynamicResource MaterialDesignCardWindow}"
Background="{x:Null}"
Title="LoginWindow" WindowStartupLocation="CenterScreen" ResizeMode="NoResize"
Width="{Binding Width, Mode=TwoWay}"
Height="{Binding Height, Mode=TwoWay}"
Loaded="mainWindow_Loaded">
<Window.DataContext>
<viewModels:LoginWindowViewModel />
</Window.DataContext>
<Grid x:Name="mainGrid">
<Image Source="{Binding BackgroundImage}" Margin="-1" />
<Rectangle Fill="{DynamicResource PrimaryHueMidBrush}" />
<Grid>
...
</Grid>
</Grid>
</Window>
Итак, как вы можете видеть, я сделал простую привязку между ViewModel и View, где Высота и Ширина установлены в ViewModel, где причина в том, что когда я получаю изображение, которое загружается из Интернета, оно автоматически привязывается к изображению представления, Я хочу сделать анимацию открытия, как только Window будет загружен, и будет выглядеть так:
public MainWindow()
{
if(LoggedUser == null)
{
LoginWindow newLoginWindow = new LoginWindow();
newLoginWindow.ShowDialog();
}
InitializeComponent();
}
Но моя точная проблема заключается в том, что когда я вызываю событие Loaded, одно из значений (либо Ширина, либо Высота, это зависит от позиции, в которой оно связано в XAML) отличается, и оно изменяется ПОСЛЕ вызова Loaded, что я проверил создание точки останова для события SizeChanged (которого здесь нет). В основном (в данном случае) это происходит так: Инициализировано (ширина: случайная, высота: случайная) -> Ширина: 400 Высота: Случайная (749 в моем случае каждый раз по какой-то причине) -> Загружен -> Ширина: 400 Высота: 500
Если я переворачиваю позицию привязки в XAML в значение "Высота во-первых" и "Ширина во-вторых", это та же самая ситуация, но высота корректна и ширина изменяется после загрузки. Это большая проблема для меня, так как я пытаюсь сделать правильную анимацию, но центральная точка для меня другая.