2016-06-09 87 views
1

我似乎无法创建一个看起来像这样的按钮(见图片)。 enter image description here2合1按钮像双按钮

我试着到网格,2个椭圆和2周的TextBlocks的东西,看起来像它结合,但不能得到两个不同的按钮看的权利..

它通常以按钮拆分一半,然后转化成2个独立的按钮,S按钮和A按钮..

任何输入将是非常有益..

+0

听起来像所有你真正需要的是2个按钮紧挨着。按钮1是左边的半圆形,按钮2是右边的,然后只是按钮的内容或模板的样式来看看你想要的。 – Logan

+0

发表评论前,你甚至读过任何答案吗? – ArchAngel

+0

您还没有标记出其中的一个作为您正在寻找的答案。如果其中一人回答了您的问题,请将其作为您选择的答案进行检查,否则请不要期待有人进来并对此发表评论,好友。 – Logan

回答

1

用1个网格,2个椭圆和2周的TextBlocks我得到它的工作摆弄后.. 和2个用于调整大小的Viewbox。

的XAML:

<Window x:Class="Dual_Button.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Dual_Button" 
     mc:Ignorable="d" 
     Title="Dual Button" Height="260" Width="260"> 
    <Window.Resources> 
     <Style x:Key="FocusVisual"> 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/> 
     <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/> 
     <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/> 
     <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/> 
     <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/> 
     <SolidColorBrush x:Key="SubBack" Color="#FFD1FF00"/> 
     <SolidColorBrush x:Key="AudioBack" Color="#FF00C5FF"/> 
     <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
      <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/> 
      <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/> 
      <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="Padding" Value="1"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> 
          <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsDefaulted" Value="true"> 
           <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/> 
           <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/> 
           <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid x:Name="grid"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Ellipse x:Name="sub_Background" Height="{Binding ActualHeight, ElementName=grid, Mode=OneWay}" Width="{Binding ActualWidth, ElementName=grid, Mode=OneWay}" Fill="{DynamicResource SubBack}"/> 
     <Button x:Name="btn_Sub" Background="{x:Null}" Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" Padding="0" BorderThickness="0" Click="btn_Sub_Click" Style="{DynamicResource ButtonStyle1}" MouseEnter="btn_Sub_MouseEnter" MouseLeave="btn_Sub_MouseLeave"> 
      <Viewbox Margin="25,10,10,25"> 
       <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="S"/> 
      </Viewbox> 
     </Button> 
     <Ellipse x:Name="Audio_Background" Height="{Binding ActualHeight, ElementName=grid, Mode=OneWay}" Width="{Binding ActualWidth, ElementName=grid, Mode=OneWay}" Fill="{DynamicResource AudioBack}" Grid.Column="1" HorizontalAlignment="Right"/> 
     <Button x:Name="btn_Audio" Background="{x:Null}" Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" Padding="0" BorderThickness="0" Grid.Column="1" Click="btn_Audio_Click" Style="{DynamicResource ButtonStyle1}" MouseEnter="btn_Audio_MouseEnter" MouseLeave="btn_Audio_MouseLeave"> 
      <Viewbox Margin="10,10,25,25"> 
       <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="A"/> 
      </Viewbox> 
     </Button> 
    </Grid> 
</Window> 

后面的代码:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     void btn_Sub_MouseEnter(object sender, MouseEventArgs e) 
     { 
      try { sub_Background.Fill = Brushes.Red; } catch { } 
     } 
     void btn_Sub_MouseLeave(object sender, MouseEventArgs e) 
     { 
      try { sub_Background.Fill = (Brush)FindResource("SubBack"); } catch { } 
     } 
     void btn_Sub_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("Subtitles"); 
     } 

     void btn_Audio_MouseEnter(object sender, MouseEventArgs e) 
     { 
      try { Audio_Background.Fill = Brushes.Purple; } catch { } 
     } 
     void btn_Audio_MouseLeave(object sender, MouseEventArgs e) 
     { 
      try { Audio_Background.Fill = (Brush)FindResource("AudioBack"); } catch { } 
     } 
     void btn_Audio_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("Audio"); 
     } 
    } 

这是我的结果:它的规模能..

enter image description here

当鼠标进入S钮半圈将变成红色。 当鼠标进入A按钮时,半圈将变成紫色。

1

我可能已经设法创建了你正在寻找的东西。请注意,这需要进一步工作因为很多功能没有实现。我所做的只是创建一个“DualButton”,它具有单独的可点击部分,并且看起来像您所提供的。

你可以根据我的例子制定出你自己的风格和功能。

首先,如何看起来:

Dual Button

现在,该代码。我将它定义为一个userControl,以实现更轻松的管理和可重用性,而不会使XAML过多。

XAML:

<UserControl x:Class="WpfApplication2.DualButton" 
     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:WpfApplication2" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Button Click="Button_Click_1"> 
     <Button.Template> 
      <ControlTemplate> 
       <Grid> 
        <Path Fill="Lime" > 
         <Path.Data> 
          <PathGeometry> 
           <PathFigure StartPoint="150,0"> 
            <ArcSegment IsLargeArc="True" 
          Size="50, 50" 
          Point="150, 300" 
          SweepDirection="Counterclockwise" /> 
           </PathFigure> 
          </PathGeometry> 
         </Path.Data> 
        </Path> 
        <TextBlock Margin="49,46,171,83" FontSize="150" TextAlignment="Center" HorizontalAlignment="Center" Foreground="White">S</TextBlock> 
       </Grid> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
    <Button Click="Button_Click_2"> 
     <Button.Template> 
      <ControlTemplate> 
       <Grid> 
        <Path Fill="Blue" > 
         <Path.Data> 
          <PathGeometry> 
           <PathFigure StartPoint="150,0"> 
            <ArcSegment IsLargeArc="True" 
          Size="50, 50" 
          Point="150, 300" 
          SweepDirection="Clockwise" /> 
           </PathFigure> 
          </PathGeometry> 
         </Path.Data> 
        </Path> 
        <TextBlock Margin="162,47,41,84" FontSize="150" TextAlignment="Center" HorizontalAlignment="Center" Foreground="White" Width="97">A</TextBlock> 
       </Grid> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 
</Grid> 

那么,什么是真正发生在这里?

首先,当然有布局网格。它包含两个buttons,它们的模板设置为PathGeometry以创建一个椭圆。 (这里已经是一些改进的地方 - 我用固定值,所以button不会真正可扩展的尝试这些特性与grid大小连接。)

再有就是对按钮半明显字母textBlock 。再一次,我没有放置过多的麻烦,我只是拖着他们,所以他们看起来不错。你可以工作,这对自己太(我希望:d)现在

,与后台代码:

public partial class DualButton : UserControl 
{ 
    public DualButton() 
    { 
     InitializeComponent(); 
    } 

    public static readonly RoutedEvent ClickEvent = 
EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, 
typeof(RoutedEventHandler), typeof(DualButton)); 

    public event RoutedEventHandler Click 
    { 
     add { AddHandler(ClickEvent, value); } 
     remove { RemoveHandler(ClickEvent, value); } 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("Left"); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("Right"); 
    } 
} 

在这里,我们要添加一个RoutedEvent,使我们的按钮实际上是点击。我还添加了一些事件处理程序来检查一切是否按预期工作(它的确如此!)

再次,这只是一个简单的例子,并没有经过优化。有很大的改进空间。我只是想把你推向正确的方向。

如果您有任何问题,请随时询问。

+0

看看我自己的答案..并看看你是否喜欢它..唯一觉得我不喜欢你的答案是你用于半圆形状的路径.. – ArchAngel

+0

我也喜欢你的答案。至于路径,我不同意,因为使用正确的绑定可以产生任何想要的形状(不只是椭圆形)。你的viewBox理念也非常好,你的答案比我的MVVM多得多,这非常棒。说实话,我以为你不知道如何解决这个问题,所以我刚刚创建了一个快速划分的示例,它是硬编码的,并且不会对写入的样式产生太大的影响。我猜我们的答案都有优点,缺点,但现在你的是更发达:) –

+0

我不是新手,即使我可以自己做,有时我喜欢看别人怎么做..而且我给了你+1投票,因为你的答案不是不好.. – ArchAngel