Я понял это, ребята.
Таким образом, в ориентации 0 или 180 Shape.top и Shape.Left дают точные последовательные измерения.
В 90 или 270 верхний и левый должны быть скорректированы, чтобы дать точные последовательные измерения.
Код: Shape.Top - ((Shape.Width-Shape.Height) / 2) и Shape.Left + ((Shape.Width-Shape.Height) / 2)
(ПРИМЕЧАНИЕ. РЕГУЛИРОВКА ТОЛЬКО ПРИМЕНЯЕТСЯ, КОГДА ОБЪЕКТИРУЕТСЯ НА 90 или 270 // Shape.Rotation)
Кроме того, здесь используется форма с угловым соединителем
Попытайтесь использовать
.Owner = Window.GetWindow(this)
Для получения высокоуровневого окна управление находится в, предполагая, что существует тот:
(Window)PresentationSource.FromVisual(this).RootVisual
Для получения главного окна:
Application.Current.MainWindow
Обновление, чтобы попытаться помочь Greg из комментариев. Команда работает в меню главных окон, кнопке в пользовательском элементе управления и контекстном меню в пользовательском элементе управления.
я сделал бы это с командами. Поэтому имейте класс Commands.cs что-то как:
public static class Commands
{
public static RoutedUICommand TestShowDialogCommand = new RoutedUICommand("Test command", "TestShowDialog", typeof(Commands));
}
Регистр они в Вашем главном окне: (Вам не нужен canshow, он принимает значение по умолчанию к истинному)
public Window1()
{
InitializeComponent();
CommandManager.RegisterClassCommandBinding(typeof(System.Windows.Controls.Control),
new CommandBinding(Commands.TestShowDialogCommand, ShowDialogCommand, CanShowDialogCommand));
}
private void ShowDialogCommand(object sender, ExecutedRoutedEventArgs e)
{
var box = new Window();
box.Owner = this;
box.ShowDialog();
}
private void CanShowDialogCommand(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
, Это - мой xaml для главного окна:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="322">
<Grid>
<StackPanel>
<Menu>
<MenuItem Header="Test">
<MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}"/>
</MenuItem>
</Menu>
<WpfApplication1:BazUserControl />
</StackPanel>
</Grid>
</Window>
Это - xaml для моего пользовательского элемента управления (код по умолчанию позади только)
<UserControl x:Class="WpfApplication1.BazUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Height="300" Width="300">
<Grid>
<StackPanel>
<Button Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" Content="ClickMe" ></Button>
<TextBox>
<TextBox.ContextMenu>
<ContextMenu>
<MenuItem Header="ShowDialog" Command="{x:Static WpfApplication1:Commands.TestShowDialogCommand}" />
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>
</StackPanel>
</Grid>
</UserControl>
, Вы могли взять его немного далее и обработать команду в классе контроллера вместо этого и сделать его, который укусил больше MVC.
Я добрался, это для работы путем проверки полностью создает резервную копию через мой XAML...
box.Owner = DirectCast(DirectCast(DirectCast(Me.Parent, Grid).Parent, Grid).Parent, Window)
, Но это кажется довольно неэлегантным. Существует ли лучший путь?
Что относительно того, чтобы менять имя окна к WindowMain1 или чему-то, и установить владельца на это?