2013-07-01 3 views
0

Так что, много оглядываясь, я надеюсь сделать GroupBox, который действует как кнопка Радио. Секция заголовка будет действовать как пуля. Я взял код из этого вопросаXAML, чтобы добавить заголовок к радиокнопке

Styling a GroupBox

, который, как я хочу, чтобы она выглядела. Но я хочу, чтобы это было как кнопка радио. Так что я положил в этом коде (возражают вас я только делал WPF в течение недели или 2) в настоящее время

<Style TargetType="{x:Type RadioButton}" > 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type RadioButton}"> 
        <BulletDecorator> 
         <BulletDecorator.Bullet> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto" /> 
            <RowDefinition Height="*" /> 
           </Grid.RowDefinitions> 
           <Border x:Name="SelectedBorder" 
             Grid.Row="0" 
             Margin="4" 
             BorderBrush="Black" 
             BorderThickness="1" 
             Background="#25A0DA"> 
            <Label x:Name="SelectedLabel" Foreground="Wheat"> 
             <ContentPresenter Margin="4" /> 
            </Label> 
           </Border> 
           <Border> 

           </Border> 
          </Grid> 
         </BulletDecorator.Bullet> 
        </BulletDecorator> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="true"> 
          <Setter TargetName="SelectedBorder" Property="Background" Value="PaleGreen"/> 
          <Setter TargetName="SelectedLabel" 
            Property="Foreground" 
            Value="Black" /> 
         </Trigger> 

        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

У меня есть ощущение, что я могу добавить метку ко второй строке моей сетки, но затем Я не знаю, как получить к нему доступ. У меня есть этот шаблон в тестовом проекте в разделе Window.Resources (я планирую перенести его в словарь ресурсов в моем основном проекте) Части XAML для моего окна это

<Grid> 
    <GroupBox Name="grpDoor" Margin ="8" Grid.Row="0" Grid.Column="0"> 
     <GroupBox.Header> 
      WPF RadioButton Template 
     </GroupBox.Header> 
     <StackPanel Margin ="8"> 
      <RadioButton FontSize="15" Content="Dhaka" Margin="4" IsChecked="False"/> 
      <RadioButton FontSize="15" Content="Munshiganj" Margin="4" IsChecked="True" /> 
      <RadioButton FontSize="15" Content="Gazipur" Margin="4" IsChecked="False" /> 
     </StackPanel> 
    </GroupBox> 
</Grid> 

я тогда надеялся на что-то вроде это (не знаю, как бы я это сделать еще хотя)

<Grid> 
    <GroupBox Name="grpDoor" Margin ="8" Grid.Row="0" Grid.Column="0"> 
     <GroupBox.Header> 
      WPF RadioButton Template 
     </GroupBox.Header> 
     <StackPanel Margin ="8"> 
      <RadioButton FontSize="15" 
          Content="Dhaka" 
          Margin="4" 
          IsChecked="False"> 
       <RadioButton.Description> 
        This is a description that would show under my Header 
       </RadioButton.Description> 
      </RadioButton> 
      <RadioButton FontSize="15" 
          Content="Munshiganj" 
          Margin="4" 
          IsChecked="True"> 
       <RadioButton.Description> 
        This is a description that would show under my Header 
       </RadioButton.Description> 
      </RadioButton> 
      <RadioButton FontSize="15" 
          Content="Gazipur" 
          Margin="4" 
          IsChecked="False"> 
       <RadioButton.Description> 
        This is a description that would show under my Header 
       </RadioButton.Description> 
      </RadioButton> 
     </StackPanel> 
    </GroupBox> 
</Grid> 
+0

Просто уточнить. Вы хотите, чтобы GroupBox вел себя как RadioButton? Если это так, может быть проще использовать RadioButtons и стилизовать их, чтобы они выглядели как набор GroupBoxes. – Trevor

+0

@Trevor да, это мой план. –

ответ

1

Основываясь на ваших разъяснений, здесь очень простой пример с RadioButton, который выглядит как GroupBox.

<Window x:Class="MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:SimpleViewModel/> 
    </Window.DataContext> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:SimpleOption}"> 
      <RadioButton GroupName="choice" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"> 
       <RadioButton.Template> 
        <ControlTemplate TargetType="{x:Type RadioButton}"> 
         <GroupBox x:Name="OptionBox" Header="{Binding Path=DisplayName, Mode=OneWay}"> 
          <TextBlock Text="{Binding Path=Description, Mode=OneWay}"/> 
         </GroupBox> 
         <ControlTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=IsSelected, Mode=OneWay}" Value="True"> 
           <Setter TargetName="OptionBox" Property="Background" Value="Blue"/> 
          </DataTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </RadioButton.Template> 
      </RadioButton> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Path=Options, Mode=OneWay}"/> 
    </Grid> 
</Window> 

public class SimpleViewModel 
{ 

    public SimpleViewModel() 
    { 
     Options = new ObservableCollection<SimpleOption>(); 
     var _with1 = Options; 
     _with1.Add(new SimpleOption { 
      DisplayName = "Dhaka", 
      Description = "This is a description for Dhaka." 
     }); 
     _with1.Add(new SimpleOption { 
      DisplayName = "Munshiganj", 
      Description = "This is a description for Munshiganj.", 
      IsSelected = true 
     }); 
     _with1.Add(new SimpleOption { 
      DisplayName = "Gazipur", 
      Description = "This is a description for Gazipur." 
     }); 
    } 

    public ObservableCollection<SimpleOption> Options { get; set; } 

} 

public class SimpleOption : INotifyPropertyChanged 
{ 

    public string DisplayName { 
     get { return _displayName; } 
     set { 
      _displayName = value; 
      NotifyPropertyChanged("DisplayName"); 
     } 
    } 

    private string _displayName; 
    public string Description { 
     get { return _description; } 
     set { 
      _description = value; 
      NotifyPropertyChanged("Description"); 
     } 
    } 

    private string _description; 
    public bool IsSelected { 
     get { return _isSelected; } 
     set { 
      _isSelected = value; 
      NotifyPropertyChanged("IsSelected"); 
     } 
    } 

    private bool _isSelected; 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 
    public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 

} 
1

Я бы сделал это с использованием специального свойства. Таким образом, вы можете привязать его к ViewModel или применить его непосредственно в XAML.

Во-первых, создать новый класс в вашем Style сборки:

public static class RadioButtonExtender 
{ 
    public static readonly DependencyProperty DescriptionProperty = DependencyProperty.RegisterAttached(
     "Description", 
     typeof(string), 
     typeof(RadioButtonExtender), 
     new FrameworkPropertyMetadata(null)); 

    [AttachedPropertyBrowsableForType(typeof(RadioButton))] 
    public static string GetDescription(RadioButton obj) 
    { 
     return (string)obj.GetValue(DescriptionProperty); 
    } 

    public static void SetDescription(RadioButton obj, string value) 
    { 
     obj.SetValue(DescriptionProperty, value); 
    } 
} 

И ваш стиль-х Bullet бы изменить так, чтобы метка:

<Label x:Name="SelectedLabel" 
     Foreground="Wheat" 
     Content="{Binding (prop:RadioButtonExtender.Description), RelativeSource={RelativeSource TemplatedParent}} /> 

Вы могли бы затем использовать его в окончательном XAML :

<RadioButton FontSize="15" 
      Content="Dhaka" 
      Margin="4" 
      IsChecked="False"> 
    <prop:RadioButtonExtender.Description> 
     This is a description that would show under my Header 
    </prop:RadioButtonExtender.Description> 
</RadioButton> 

В качестве дополнительного бонуса, поскольку вы создаете Style в отдельной сборке, вы можете создать custom XAML namespace, чтобы упростить использование вашей собственности.

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

  • Нет связанных вопросов^_^