代码之家  ›  专栏  ›  技术社区  ›  photo_tom

WPF-默认按钮未按预期工作

  •  16
  • photo_tom  · 技术社区  · 15 年前

    我对违约有意见 Button 在下面的XAML代码中:

    <Window x:Class="WebSiteMon.Results.Views.GraphicSizeSelectPopUp"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:commonWPF="http://rubenhak.com/common/wpf"
            xmlns:WPF="clr-namespace:Bennedik.Validation.Integration.WPF;assembly=Bennedik.Validation.Integration.WPF"
            ResizeMode="NoResize"
            WindowStyle="ThreeDBorderWindow"
            SizeToContent="WidthAndHeight">
      <Window.Resources>
        <Style TargetType="{x:Type TextBox}">
          <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
              <ControlTemplate>
                <Border BorderBrush="Red"
                        BorderThickness="2">
                  <AdornedElementPlaceholder />
                </Border>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
          <Style.Triggers>
            <Trigger Property="Validation.HasError"
                     Value="true">
              <Setter Property="ToolTip"
                      Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
          </Style.Triggers>
        </Style>
      </Window.Resources>
      <WPF:ErrorProvider x:Name="UrlDataErrorProvider"
                         RulesetName="RuleSetA">
        <Grid Background="{DynamicResource WindowBackgroundBrush}">
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
          </Grid.RowDefinitions>
    
          <RadioButton Grid.ColumnSpan="2"
                       Margin="10"
                       Name="radioButton1"
                       Content="640 x 480 pixels"
                       Command="{Binding SelectSizeRb}"
                       CommandParameter="640,480" />
          <RadioButton Grid.ColumnSpan="2"
                       Margin="10"
                       Name="radioButton2"
                       Content="800 x 600 pixels"
                       Command="{Binding SelectSizeRb}"
                       CommandParameter="800,600"
                       Grid.Row="1"
                       IsChecked="True" />
          <RadioButton Grid.ColumnSpan="2"
                       Margin="10"
                       Name="radioButton3"
                       Content="1024 x 768 pixels"
                       Command="{Binding SelectSizeRb}"
                       CommandParameter="1024,768"
                       Grid.Row="2" />
          <RadioButton Grid.ColumnSpan="2"
                       Margin="10"
                       Name="radioButton4"
                       Command="{Binding SelectSizeRb}"
                       CommandParameter="0,0"
                       Grid.Row="3" />
    
          <Button Grid.Column="1"
                  Grid.ColumnSpan="1"
                  Grid.Row="5"
                  Margin="5"
                  Name="BtnOk"
                  IsDefault="True">Ok</Button>
          <Button Grid.Column="2"
                  Grid.ColumnSpan="1"
                  Grid.Row="5"
                  Margin="5"
                  Name="BtnCancel"
                  IsCancel="True">Cancel</Button>
    
        </Grid>
      </WPF:ErrorProvider>
    </Window>
    

    我使用以下代码调用上述窗口:

    var p = new GraphicSizeSelectPopUp();
    var result = p.ShowDialog() ?? false;
    p.Close();
    

    我把这个当作 Popup 窗口在我的应用程序中获取一些信息从用户。我的问题是当我点击 OK 巴顿,什么都没发生。这个 Cancel 按钮的工作方式与预期完全相同,这意味着控件从 ShowDialog 方法。

    据我所知,WPF(仍然是新手),我所要做的就是设置 IsDefault 属性设置为true,以便默认按钮执行相同操作。然而,这不是我看到的。当我在后面的行上设置断点时, 显示对话框 方法,当我按下OK按钮时,它不会被击中。只有当我按下 取消 按钮或关闭窗口。

    对不知情者的建议?

    2 回复  |  直到 11 年前
        1
  •  26
  •   Thomas Levesque    12 年前

    这个 IsDefault 属性仅表示当按下Enter键时,此按钮被“单击”。它不会关闭对话框,也不会设置 DialogResult ,您必须在代码隐藏中手动执行此操作:

    private void BtnOK_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
    }
    

    (设置) 对话结果 同时关闭窗口)

        2
  •  8
  •   user2220595    11 年前

    为了使事情更美好,您可以使用像这样的附加属性:

    <Button Content="OK" IsDefault="True" local:DialogBehaviours.OkButton="true" 
    Height="23" HorizontalAlignment="Left" Width="75" />
    

    附加属性可以这样定义:

    public class DialogBehaviours
    {
    
        /*
            OkButton property.
    
            An attached property for defining the Accept (OK) button on a dialog.
            This property can be set on any button, if it is set to true, when enter is pressed, or
            the button is clicked, the dialog will be closed, and the dialog result will be set to
            true.
        */
        public static bool GetOkButton(DependencyObject obj)
        {return (bool)obj.GetValue(OkButtonProperty);       }
    
        public static void SetOkButton(DependencyObject obj, bool value)
        {obj.SetValue(OkButtonProperty, value);     }
    
        public static readonly DependencyProperty OkButtonProperty =
            DependencyProperty.RegisterAttached("OkButton", typeof(bool), typeof(Button), new UIPropertyMetadata(false, OnOkButtonPropertyChanged_));
    
        static void OnOkButtonPropertyChanged_(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            if (!(obj is Button) || !(e.NewValue is bool))
                return;
    
            Button button = (Button)obj;
            bool value = (bool)e.NewValue;
    
            if (value)
                button.Click += OnAcceptButtonClicked_;
            else
                button.Click -= OnAcceptButtonClicked_;
    
            button.IsDefault = value;
        }
    
        static void OnAcceptButtonClicked_(object sender, RoutedEventArgs e)
        {
            if (!(sender is DependencyObject))
                return;
    
            Window parent = FindParent<Window>((DependencyObject)sender, (c) => true);
            if (parent != null)
            {
                try { parent.DialogResult = true; }
                catch (Exception)
                {
                    parent.Close();
                }
            }
        }
    
        public static T FindParent<T>(DependencyObject obj, Predicate<T> predicate) where T : FrameworkElement
        {
            if (obj == null || predicate == null)
                return null;
    
            if (obj is T)
            {
                T control = (T)obj;
                if (predicate(control))
                    return control;
            }
    
            DependencyObject parent = VisualTreeHelper.GetParent(obj);
            return (parent == null) ? null : FindParent<T>(parent, predicate);
        }
    }