2015-03-16 4 views
0

я следующий стиль для подсказки:WPF: ToolTip в новом окне

 <Style x:Key="ToolTipPopUp" TargetType="{x:Type ContentControl}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ContentControl}"> 
         <StackPanel Orientation="Horizontal"> 
          <StackPanel.ToolTip> 
           <ToolTip Visibility="Hidden" /> 
          </StackPanel.ToolTip> 
          <ContentPresenter /> 
          <Image Source="/Resources/info.png" 
            ToolTip="{TemplateBinding ToolTip}" 
            Height="12" 
            VerticalAlignment="Top" /> 
         </StackPanel> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Это называется с помощью:

  <ContentControl Style="{StaticResource ToolTipPopUp}" ToolTip="Hello world"> 
       <CheckBox Content="I am a check box" /> 
      </ContentControl> 

Это позволяет мне прикрепить ToolTip к любому контролю, я хочу и отображает ToolTip, как ожидалось.

enter image description here

клиент теперь с просьбой о том, что ToolTip будет показан в всплывающем окне, как содержание иногда может быть довольно длительным.

Есть ли способ конвертировать этот стиль, чтобы показать всплывающее окно? Я прочитал, что Window не может использоваться ContentControl, поэтому, если есть другой способ сделать это, я открыт для этого.

EDIT

У меня есть статический ресурс инструкции (не показаны для ясности), что я связывающихся с подсказкой (то есть то, что я делаю сейчас). Я думал создать одноэлементное окно, которое откроется, когда пользователь нажмет значок всплывающей подсказки (синий «i»), будет обновлять свойство во всплывающем окне (т. Е. Содержимое всплывающей подсказки) всякий раз, когда нажимается значок всплывающей подсказки (поэтому, если окно уже открыто, команды в окне меняются). После этого пользователь может закрыть окно.

РЕШЕНИЕ

Благодаря Феодосием для указал мне в правильном направлении. Вот как я реализовал это:

MainPageViewModel.cs (самое верхнее окно выполнения программы):

private Window _toolTipWindow; 

    /// <summary> 
    /// Display the tool tip text in a new window 
    /// </summary> 
    public void ToolTipPopUpClicked(object sender, RoutedEventArgs e) 
    { 
     if (_toolTipWindow == null || !_toolTipWindow.IsVisible) 
     { 
      _toolTipWindow = new Window(); 
     } 

     String _instructions = (((Button)sender).TemplatedParent as ContentControl).ToolTip.ToString(); 

     _toolTipWindow.Width = 300; 
     _toolTipWindow.Height = 200; 

     _toolTipWindow.Content = _instructions; 
     _toolTipWindow.Show(); 
    } 

StylesDictionary.xaml

<Style x:Key="ToolTipPopUp" TargetType="{x:Type ContentControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContentControl}"> 
       <StackPanel Orientation="Horizontal"> 
        <ContentPresenter /> 
        <Button Width="Auto"> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="Click"> 
           <ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, 
                         Path=DataContext}" 
                  MethodName="ToolTipPopUpClicked" /> 
          </i:EventTrigger> 
         </i:Interaction.Triggers> 
         <Button.Template> 
          <ControlTemplate> 
           <Image Source="Resources/info.png" 
              ToolTip="{TemplateBinding ToolTip}" 
              Height="12" 
              VerticalAlignment="Top" > 

           </Image> 
          </ControlTemplate> 
         </Button.Template> 
        </Button> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

XAML файл

  <ContentControl Name="PopupExample" 
          Style="{StaticResource ToolTipPopUp}" 
          ToolTip="Hello world"> 
       <CheckBox Content="I am a check box" /> 
      </ContentControl> 

Это сохраняет стандартную функциональность ToolTip и предоставляет всплывающее окно, когда пользователь нажимает на значок подсказки инструмента (синий «i»).

ответ

-1

Как насчет этого тогда?

<Style x:Key="ToolTipPopUp" TargetType="{x:Type ContentControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ContentControl}"> 
        <StackPanel Orientation="Horizontal"> 
         <StackPanel.ToolTip> 
          <ToolTip Visibility="Hidden" /> 
         </StackPanel.ToolTip> 
         <ContentPresenter /> 
         <Image Source="/info.png" 
           ToolTip="{TemplateBinding ToolTip}" 
           Height="12" 
           VerticalAlignment="Top" > 
          <Image.Style> 
           <Style> 
            <EventSetter Event="Mouse.MouseEnter" Handler="Show_PopupToolTip" /> 
            <EventSetter Event="Mouse.MouseLeave" Handler="Hide_PopupToolTip"/> 
           </Style> 
          </Image.Style> 
         </Image> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Code-за ...

Window win; 

    private void Show_PopupToolTip(object sender, MouseEventArgs e) 
    { 
     var fred = ((Image)sender).TemplatedParent; 

     if (fred != null) 
     { 
      ContentControl c = fred as ContentControl; 
      string myText = c.ToolTip.ToString(); 

      if (!String.IsNullOrEmpty(myText)) 
      { 
       if (win == null || !win.IsVisible) 
        win = new Window(); 
       win.Height = 275; 
       win.Width = 275; 
       win.Content = myText; 
       win.Show(); 
      } 
     } 
    } 
    private void Hide_PopupToolTip(object sender, MouseEventArgs e) 
    { 
     //if (win != null) 
     //{ 
     // win.Close(); 
     //} 
    } 
+0

Пожалуйста сделайте ваш ответ более полезным, добавив некоторый контент из связанной страницы или пользовательский пример того, как использовать 'управления Popup'. – Sheridan

+0

Насколько я могу сказать, PopUp требует некоторого метода обработки события щелчка кнопки, связанной с PopUp. Я бы предпочел решение, для которого не требуется событие button & onClick (и связанный с ним код), поскольку оригинальный стиль используется в многочисленных UserControls. – BrianKE

+0

Прежде чем я смогу дать лучший ответ, мне нужно знать: в чем цель создания окна? Это потому, что всплывающая подсказка закрывается, прежде чем они смогут прочитать все или что?Реальное окно, которое нужно было бы закрыть, было бы так раздражать! Вы можете сделать текст в всплывающей подсказке, если он слишком длинный или что-то еще. См. Мой ответ, чтобы узнать, как вы можете создать всплывающее окно пользовательской всплывающей подсказки. В этом примере вам предоставлена ​​всплывающая подсказка для источника текста, вы просто отключите фактическую подсказку. BTW, этот код можно использовать для отображения любого вида контроля и т. Д. –