Как открыть диалог и разместить его в правом нижнем углу родительской страницы WPF? - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть база Страница WPF (не Window) , в которой есть кнопка. Теперь, когда я нажимаю на кнопку, мне нужно открыть модальное диалоговое окно и поместить его в нижнюю правую часть родительского элемента (страница WPF).

Я создал модальное диалоговое окно следующим образом: *

  CDialog dialog = new CDialog();
  dialog.ShowDialog();

Теперь я не могу понять , как разместить диалог в нижней правой части родительской страницы WPF. !!

РЕДАКТИРОВАТЬ 1: Я пытаюсь эти 2 метода в codebehind of CDialog, но я получаю Parent как ноль!

   private void Window_Loaded(object sender, RoutedEventArgs e)
    {

         object obj = (sender as Window).Parent; //nullreference exception
    }

    private void Window_LayoutUpdated(object sender, EventArgs e)
    {
        object obj = (sender as Window).Parent; //nullreference exception
    }

Какой метод я должен использовать ??

Ответы [ 2 ]

0 голосов
/ 24 ноября 2010

Возможно, вам следует попробовать пользовательское модальное диалоговое решение, возможно, используя DispatcherFrame.

Вот пример, который я придумал для очень похожего решения ( текст ссылки ) - запуститепример, и посмотрите, что я имею в виду:

public partial class Window1 : Window
{
    private DispatcherFrame frame;
    private readonly ObservableCollection<string> collection = new ObservableCollection<string>();
    public Window1()
    {
        InitializeComponent();
        DataContext = collection;
    }

    private void GetData(object sender, RoutedEventArgs e)
    {
        collection.Clear();
        frame = new DispatcherFrame();
        popupGrid.Visibility = Visibility.Visible;
        System.Windows.Threading.Dispatcher.PushFrame(frame); // blocks gui message pump & creates nested pump
        var count = int.Parse(countText.Text); // after DispatcherFrame is cancelled, it continues
        for (int i = 0; i < count; i++)
            collection.Add("Test Data " + i);
        popupGrid.Visibility = Visibility.Hidden;
    }

    private void DataCountEntered(object sender, RoutedEventArgs e)
    {
        frame.Continue = false; // un-blocks gui message pump
    }
}

и это XAML

<Grid>
<TabControl>
  <TabItem Header="TabItem">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <ListBox ItemsSource="{Binding}"/>
      <Button HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"
              Content="Get Data" Grid.Row="1" Margin="0,5" Click="GetData"/>
    </Grid>
  </TabItem>
  <TabItem Header="TabItem">
    <Grid/>
  </TabItem>
</TabControl>
<Grid Name="popupGrid" Visibility="Hidden">
  <Grid.Background>
    <SolidColorBrush Opacity="0.4" Color="#FFD8CFCF"/>
  </Grid.Background>
  <Border HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="100"
          BorderBrush="Black" BorderThickness="1" Background="White" Padding="5">
    <StackPanel>
      <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Enter Number Of Items"/>
      <TextBox HorizontalAlignment="Left" Text="10" TextWrapping="Wrap" Margin="0,3"
               Width="100" Name="countText"/>
      <Button HorizontalAlignment="Left" Width="75" Content="Do Data Add" Click="DataCountEntered"/>
    </StackPanel>
  </Border>
</Grid>

0 голосов
/ 24 ноября 2010

Следующий код должен помочь:

child.Left = parent.ActualWidth - child.ActualWidth;
child.Top = parent.ActualHeight - child.ActualHeight;

ПРИМЕЧАНИЕ: в этом коде предполагается, что дочерний элемент был обработан, и, таким образом, свойства Actual * имеют правильные значения. Поэтому поместите этот код в место, где вы знаете, что ребенок был отрендерен / показан.

...