2016-12-14 6 views
2

Я работаю над модальным диалоговым окном (я не уверен в точном терминах UX), который отображается встроенным, внутри элемента управления или окна с затемненным фоном ,Простой всплывающий диалог в WPF (оверлей внутри окна)

Визуальный пример

example

То, что я пытался ставит <ContentPresenter /> внутри XAML всплывающего окна, а затем просто создать его экземпляр, как это:

<local:Popup Grid.RowSpan="2"> 
    <TextBlock Text="Popup test..." /> 
</local:Popup> 

Однако XAML заменяет весь всплывающий XAML вместо того, чтобы размещаться там, где находится ContentPresenter.

Вопрос: Как здесь правильно используется ContentPresenter?

Popup.xaml

<ContentControl 
    x:Class="[...].Popup" 
    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:[...]" 
    mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="300"> 
    <Grid Background="#7f000000"> 
     <Grid Background="White" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <StackPanel Margin="20"> 
       <TextBlock Text="{Binding Title, RelativeSource={RelativeSource AncestorType=UserControl}}" FontSize="20" /> 
       <ContentPresenter /> 
      </StackPanel> 
     </Grid> 
    </Grid> 
</ContentControl> 

Popup.xaml.cs

using System.Windows; 

namespace [...] 
{ 
    public partial class Popup : ContentControlBase 
    { 
     public static DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(Popup)); 
     public string Title 
     { 
      get 
      { 
       return (string)GetValue(TitleProperty); 
      } 
      set 
      { 
       SetValue(TitleProperty, value); 
      } 
     } 

     public Popup() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

ответ

2

содержания вашего всплывающего окна должен быть определен как ControlTemplate для ContentPresenter работать, как ожидалось здесь. Пожалуйста, обратитесь к следующему образцу кода.

Popup.xaml:

<ContentControl 
x:Class="WpfApplication1.Popup" 
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:WpfApplication1" 
mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="300" 
x:Name="popup"> 
<ContentControl.Template> 
    <ControlTemplate TargetType="local:Popup"> 
     <Grid Background="#7f000000"> 
      <Grid Background="White" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <StackPanel Margin="20"> 
        <TextBlock Text="{Binding Title, ElementName=popup}" FontSize="20" /> 
        <ContentPresenter /> 
       </StackPanel> 
      </Grid> 
     </Grid> 
    </ControlTemplate> 
</ContentControl.Template> 

Popup1.xaml.cs.

public partial class Popup : ContentControl 
{ 
    public static DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(Popup)); 
    public string Title 
    { 
     get 
     { 
      return (string)GetValue(TitleProperty); 
     } 
     set 
     { 
      SetValue(TitleProperty, value); 
     } 
    } 

    public Popup() 
    { 
     InitializeComponent(); 
    } 
} 

}

Window1.xaml:

<local:Popup Title="Title..."> 
    <TextBlock>Text...</TextBlock> 
</local:Popup> 
+0

Параметр '' сделал все трюк. Спасибо! +1 – bytecode77