2013-09-10 5 views
4

Фон: У меня есть проект, который использует datagrid для отображения данных, а datagrid имеет столбец rowdetail, который включает usercontrol. Пользователь usercontrol имеет некоторый TextBox для ввода и отображения некоторых сообщений.wpf: Как всплывающее окно usercontrol?

Проблема: Я хочу сделать всплывающее окно usercontrol, когда я нажимаю кнопку, а всплывающее пользовательское управление имеет тот же контекст, что и usercontrol в столбце rowdetail в datagrid. Это делается для того, чтобы пользователи могли интерактивно взаимодействовать с usercontrol, поскольку эта ячейка ячейки rowdetail ограничена.

Утилита usecontrol реализована и может нормально работать в ячейке rowdetail. Тем не менее, я понятия не имею, как всплывать без изменения его контекста, например источника данных, сообщений в TextBox и т. Д. Кто-нибудь может дать мне несколько советов? Кстати, я использую шаблон MVVM.

EDIT: Вот RowDetailTemplate:

<DataTemplate x:Key="RowDetailTemplate"> 
    <Grid x:Name="RowDetailGrid" HorizontalAlignment="Left" Width="850" Height="355" > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="100" /> 
     </Grid.ColumnDefinitions> 
     <my:MyUserControl x:Name="myUserControl" /> 
     <Button Grid.Row="1" Width="60" Height="25" Content="Pop Up" 
        Command="{Binding Path=PopupCommand}"/> 
     ..... 
    </Grid> 
</DataTemplate> 

Вот UserControl (MyUserControl в вышеуказанных кодов):

<UserControl x:Class="MyProject" 
     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" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="600"> 
<Grid> 
    <ScrollViewer Margin="0" HorizontalScrollBarVisibility="Disabled" > 
     <StackPanel> 
      <ItemsControl Grid.Row="0" ItemsSource="{Binding Output, Mode=OneWay}" FontSize="12"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
          <TextBlock TextWrapping="Wrap" Text="{Binding Path=.}" Foreground="White" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
      <DockPanel Grid.Row="1" LastChildFill="True">      
       <TextBox Text="{Binding Input, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
        TextWrapping="Wrap" 
        BorderBrush="{x:Null}" SelectionBrush="{x:Null}" 
        BorderThickness="0" Width="Auto"> 
        <TextBox.InputBindings> 
         <KeyBinding Command="{Binding Path=TextBoxEnter}" Key="Enter" /> 
        </TextBox.InputBindings> 
       </TextBox> 
      </DockPanel> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

+0

вы можете поделиться своим кодом datagrid и usercontrol ...? – Nitin

+0

Не можете ли вы реализовать его на messageBox с помощью своего пользовательского элемента управления? – ThomasFey

+0

@nit, я отредактировал проблему. –

ответ

6

Вы можете использовать управление Popup , Прикрепите Popup к текущей строке вашего datagrid, вероятно, когда вы нажмете кнопку, это хорошее место для создания всплывающего окна и поместите его как дочерний элемент из одной из ячеек в строке, в которой вы находитесь.
Затем вы можете добавить usercontrol к всплывающему окну, а затем «показать» всплывающее окно. Таким образом, DataContext для всплывающего окна и, следовательно, для usercontrol наследуется от содержащейся строки в datagrid.

Ниже приведен очень простая реализация Popup управления только с помощью XAML:

<StackPanel> 
    <CheckBox Name="chk1"/> 
    <Popup IsOpen="{Binding IsChecked, ElementName=chk1}"> 
    <Border Background="White"> 
     <TextBlock Margin="20" Text="I'm Popped Up!"/> 
    </Border> 
    </Popup> 
</StackPanel> 

Всплывающий входят в StackPanel, но только видно, IsOpen, когда флажок установлен. Вы разместили бы usercontrol во всплывающем окне, где я установил границу и текстовый блок. Поскольку всплывающее окно является членом панели стека, оно автоматически использует DataContext панели стека, если у него нет своего собственного.

В вашем примере стек, который я показываю, будет аналогичен вашей строке DataGrid.

+0

Привет, я никогда не пользовался функцией Popup. Не могли бы вы привести несколько простых примеров?Благодарю. –

+0

Использование всплывающего меню - хорошая идея. Но я не понимаю, можно ли добавить системное меню, например Close, Maximize и restore, как обычное окно. –

1

Ну, я хотел бы просто прокомментировать комментарий Gate Lumas, но система не позволит мне, поэтому я помещаю это в качестве ответа.

XAML Popup образец: archive of link | original link

Если вы загрузите этот образец и посмотрите файлы .xaml и .cs для Senario1, у вас будет прекрасный пример использования и реализации всплывающего окна. В качестве альтернативы вы можете просто просмотреть код на сайте, но я считаю, что я могу работать и взаимодействовать с образцом, более полезным, чем просто смотреть на код.

Смежные вопросы