2010-08-14 4 views
1

Je me demandais s'il était possible de faire un contrôle personnalisé de forme personnalisée. Je dois faire un contrôle qui contient une zone de texte, cependant le contrôle doit avoir une forme de triangle ou de sth plus sophistiqué que rectangle/carré.Contrôle de forme personnalisé WPF

Répondre

2

La réponse courte est oui. Réponse longue est en train de lire sur WPF Styles de contrôle:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="WpfApplication1.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" 
    Height="480"> 

    <Window.Resources> 
     <Style x:Key="TextBoxSample" TargetType="{x:Type TextBox}"> 
      <Setter Property="FontWeight" Value="Bold"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TextBox}"> 
         <Grid> 
          <Ellipse 
           x:Name="Border" 
           Stroke="#FF393785" 
           StrokeThickness="2" 
           > 
           <Ellipse.Fill> 
            <RadialGradientBrush GradientOrigin="0.25,0.25" RadiusY="0.75" RadiusX="0.75"> 
             <GradientStop Color="White" Offset="0.2"/> 
             <GradientStop Color="#FF2EC452" Offset="0.5"/> 
             <GradientStop Color="#FF606060" Offset="1"/> 
            </RadialGradientBrush> 
           </Ellipse.Fill> 
           </Ellipse>        
          <!-- The implementation places the Content into the ScrollViewer. It must be named PART_ContentHost for the control to function --> 
          <ScrollViewer 
           x:Name="PART_ContentHost" 
           Background="Transparent" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" 
           /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter Property="Fill" Value="#000" TargetName="Border"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Window.Resources> 
    <Grid x:Name="LayoutRoot"> 
     <TextBox 
      Style="{StaticResource TextBoxSample}" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center" 
      Text="TextBox" 
      Width="180" 
      Height="180" 
      /> 
    </Grid> 
</Window> 
+0

semble intéressant, mais pourquoi avez-vous utilisé la grille dans le modèle? Elipse unique ne fonctionnerait pas? Encore une question Vous avez utilisé x: Type TextBox, puis-je utiliser un type plus général comme UserControl, ou peut-être puis-je avoir deux valeurs dans TargetType? – Berial

+0

Ellipse n'est pas ContentControl et ne peut donc pas contenir ScrollViewer (où le contenu TextBox sera placé par le contrôle TextBox). Remarque: La grille est l'un des panneaux de disposition fondamentaux. Ce n'est pas un DataGrid. Vous pouvez spécifier une classe de base pour TextBox en tant que TargetType mais cela ne fonctionnera pas comme prévu. PART_ConentHost est spécialement conçu pour TextBox. Vous pouvez créer des styles sur lesquels d'autres styles peuvent être basés. Ohh, et ne jamais définir les classes UserControls. C'est juste un très mauvais modèle pour WPF. Il a malheureusement été transféré de WinForms à WPF. Ça me rend triste quand j'y pense. – FuleSnabel

+0

Merci pour l'explication, mais j'ai encore des problèmes pour atteindre mes objectifs. Je dois créer un contrôle custon de forme comme ceci ou au moins je dois insérer dans ce polygone deux zones de texte. Cependant, je pense que ce n'est pas possible. XAML m'empêche de placer n'importe quelle zone de texte à l'intérieur du polygone :(De plus j'ai besoin de ce polygone pour remplir tout l'espace disponible (le polygone sera placé dans la grille je suppose.) – Berial

Questions connexes