2012-04-11 71 views
0

如何在後面的代碼中創建類似這樣的內容?在代碼隱藏中創建自定義數據綁定工具提示

<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip"> 
      <Setter Property="OverridesDefaultStyle" Value="true"/> 
      <Setter Property="HasDropShadow" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToolTip"> 
         <Border CornerRadius="5" HorizontalAlignment="Center" VerticalAlignment="Top" Padding="1" BorderThickness="1,1,1,1"> 
          <Border.Background> 
           <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
            <GradientStop Color="#F7D073" Offset="0"/> 
            <GradientStop Color="#F1A62F" Offset="1"/> 
           </LinearGradientBrush> 
          </Border.Background> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Border HorizontalAlignment="Stretch" BorderThickness="0,0,0,1" BorderBrush="Black" Margin="5" Grid.ColumnSpan="2"> 
            <TextBlock FontSize="14" TextAlignment="Left" Text="{TemplateBinding Content}"/> 
           </Border> 
           <TextBlock Grid.Column="0" Grid.Row="1" Margin="10,0,5,0">Column1:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="1" FontWeight="Bold" Text="{Binding Column1}" TextAlignment="Left" /> 
           <TextBlock Grid.Column="0" Grid.Row="2" Margin="10,0,5,0">Column2:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="2" FontWeight="Bold" Text="{Binding Column2}" TextAlignment="Left" /> 
           <TextBlock Grid.Column="0" Grid.Row="3" Margin="10,0,5,0">Column3:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="3" FontWeight="Bold" Text="{Binding Column3}" TextAlignment="Left" /> 
           <TextBlock Grid.Column="0" Grid.Row="4" Margin="10,0,5,0">Column4:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="4" FontWeight="Bold" Text="{Binding Column4}" TextAlignment="Left" /> 
           <TextBlock Grid.Column="0" Grid.Row="5" Margin="10,0,5,0">Column5:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="5" FontWeight="Bold" Text="{Binding Column5}" TextAlignment="Left" /> 
           <TextBlock Grid.Column="0" Grid.Row="6" Margin="10,0,5,0">ColumnX:</TextBlock> 
           <TextBlock Grid.Column="1" Grid.Row="6" FontWeight="Bold" Text="{Binding ColumnX}" TextAlignment="Left" /> 
          </Grid> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

的想法是在一個DataTable傳遞給控制與未知的列數,並能夠建立與然而,許多列有一個提示。

上面的代碼被用來構建一個非常具體的案例,但現在我想盡可能通用,但是我對WPF代碼隱藏的瞭解並不是它需要創建類似這樣的東西的地方。

+0

你爲什麼要在代碼隱藏中創建類似的東西?您應該使用在XAML中設計的ListView或GridView,並將它們綁定到您的DataTable - 全部在XAML中。請看看他們。 – Alain 2012-04-11 15:23:14

+0

感謝Alain對此的建設性意見。然而,這個想法是,這個工具提示可以用於說組合框顯示column1和鼠標懸停的組合框,tooltip顯示並顯示所有其他列。 – TriStar 2012-04-11 15:36:39

回答

0

所以我不能用工具提示中網格做到這一點,但我能與stackpanels

的解決方案,這樣做是一個多級計算策略。首先覆蓋工具提示的默認樣式

 var style = new Style {TargetType = typeof (ToolTip)}; 
     style.Setters.Add(new Setter {Property = TemplateProperty, Value = GetToolTip(dataTable)}); 
     style.Setters.Add(new Setter{Property = OverridesDefaultStyleProperty, Value = true}); 
     style.Setters.Add(new Setter{Property = System.Windows.Controls.ToolTip.HasDropShadowProperty, Value = true}); 
     Resources.Add(typeof(ToolTip), style); 

然後以創建TemplateProperty二傳手一個模板GetToolTip()函數這個樣子的

private ControlTemplate GetToolTip(DataTable dt) { 

     //Create Template where all factories will be assigned to 
     var templateTT = new ControlTemplate(typeof (ToolTip)); 

     //Main border and background of the ToolTip 
     var borderFactory = new FrameworkElementFactory(typeof (Border)); 
     borderFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(5)); 
     borderFactory.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Center); 
     borderFactory.SetValue(VerticalAlignmentProperty, VerticalAlignment.Top); 
     borderFactory.SetValue(PaddingProperty, new Thickness(1, 1, 1, 1)); 
     borderFactory.SetValue(BorderThicknessProperty, new Thickness(1,1,1,1)); 

     //Brush for the background 
     var borderBrush = new LinearGradientBrush {EndPoint = new Point(.5, 1), StartPoint = new Point(.5, 0)}; 
     borderBrush.GradientStops.Add(new GradientStop(Color.FromArgb(255,247,208,115),0)); 
     borderBrush.GradientStops.Add(new GradientStop(Color.FromArgb(255, 241, 166, 47), .5)); 

     //Assign the brush to the backgfound property of the border 
     borderFactory.SetValue(BackgroundProperty, borderBrush); 

     //Main Vertical StackPanel that will contain all the horizontal stackpanels 
     var verticalStackFactory = new FrameworkElementFactory(typeof (StackPanel)); 
     verticalStackFactory.SetValue(StackPanel.OrientationProperty, Orientation.Vertical); 

     foreach (DataColumn item in dt.Columns) { 

      //ID column is to be igoned and not shown on the tooltip 
      if(item.ColumnName.Equals("ID")) continue; 

      //Name column will be used as the "Header" of the tooltip 
      if (item.ColumnName.Equals("Name")) { 
       var headerStackFactory = new FrameworkElementFactory(typeof(StackPanel)); 
       headerStackFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); 

       //border of the header (to create the underline) 
       var headerBorderBrush = new FrameworkElementFactory(typeof (Border)); 
       headerBorderBrush.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Stretch); 
       headerBorderBrush.SetValue(BorderThicknessProperty, new Thickness(0, 0, 0, 1)); 
       headerBorderBrush.SetValue(BorderBrushProperty, new SolidColorBrush(Colors.Black)); 
       headerBorderBrush.SetValue(MarginProperty, new Thickness(5)); 

       //Text of the header bound to the Name column 
       var headerTextBox = new FrameworkElementFactory(typeof (TextBlock)); 
       headerTextBox.SetValue(FontSizeProperty, 14.0); 
       headerTextBox.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Left); 
       headerTextBox.SetValue(ForegroundProperty, new SolidColorBrush(Colors.Black)); 
       headerTextBox.SetBinding(TextBlock.TextProperty, new Binding("Name")); 

       headerBorderBrush.AppendChild(headerTextBox); 
       headerStackFactory.AppendChild(headerBorderBrush); 
       verticalStackFactory.AppendChild(headerStackFactory); 
      } 
      else { 
       //Horizontal Stack Panel 
       var horizontalStackFactory = new FrameworkElementFactory(typeof (StackPanel)); 
       horizontalStackFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); 

       //Add the TextBlock Label 
       var factoryLabel = new FrameworkElementFactory(typeof (TextBlock)); 
       factoryLabel.SetValue(MarginProperty, new Thickness(10, 0, 5, 0)); 
       factoryLabel.SetValue(ForegroundProperty, new SolidColorBrush(Colors.Black)); 
       factoryLabel.SetValue(TextBlock.TextProperty, string.Format("{0}: ", item.ColumnName.Replace("_", " "))); 
       horizontalStackFactory.AppendChild(factoryLabel); 

       //Add the TextBlock Value bound to the column name 
       var factoryText = new FrameworkElementFactory(typeof (TextBlock)); 
       factoryText.SetValue(FontWeightProperty, FontWeights.Bold); 
       factoryText.SetValue(ForegroundProperty, new SolidColorBrush(Colors.Black)); 
       factoryText.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Left); 
       factoryText.SetBinding(TextBlock.TextProperty, new Binding(item.ColumnName)); 
       horizontalStackFactory.AppendChild(factoryText); 

       verticalStackFactory.AppendChild(horizontalStackFactory); 
      } 
     } 

     borderFactory.AppendChild(verticalStackFactory); 
     templateTT.VisualTree = borderFactory; 
     return templateTT; 
    } 

的內容創建的組合框項目模板

 var template = new DataTemplate(); 
     var textBlockFactory = new FrameworkElementFactory(typeof (TextBlock)); 
     textBlockFactory.SetValue(ToolTipService.ShowDurationProperty, 60000); 
     textBlockFactory.SetValue(ToolTipService.InitialShowDelayProperty, 0); 
     textBlockFactory.SetBinding(TextBlock.TextProperty, new Binding("Name")); 
     textBlockFactory.SetBinding(ToolTipProperty, new Binding("Name")); 
     template.VisualTree = textBlockFactory; 

     InsurancePlanMaster.ItemTemplate = template; 

這讓我創建一個綁定到一個DataTable綁定到表中的其他行的自定義工具提示自定義組合框。