2009-12-16 70 views
0

我有一个ToggleButton发生故障。据我了解,一个ToggleButton应单击时检查,然后再次单击时取消选中。ToggleButton不会取消选中时点击

本例中的ToggleButton没有。点击它只是将其设置为再次检查。任何想法为什么?

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ToggleButton Width="100" Height="35" Name="btnAddLinkComment" >   
      <CheckBox Content=" Comment" FlowDirection="RightToLeft" IsHitTestVisible="False" 
         Focusable="False" IsChecked="{Binding ElementName=txtLinkComment, Path=Text}" 
         Name="chkHasComment" Margin="5"/> 
     </ToggleButton> 
     <Popup IsOpen="{Binding ElementName=btnAddLinkComment,Path=IsChecked}" 
       PlacementTarget="{Binding ElementName=btnAddLinkComment}" Name="popAddCommentLink" 
       AllowsTransparency="True" StaysOpen="False" PopupAnimation="Fade" HorizontalOffset="-50" 
       VerticalOffset="50"> 
      <Border BorderBrush="#FF000000" Background="LightBlue" BorderThickness="1,1,1,1" 
        CornerRadius="8,8,8,8" Padding="5"> 
       <Grid Background="LightBlue"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="80"></ColumnDefinition> 
         <ColumnDefinition Width="200"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 
        <TextBlock TextWrapping="Wrap" Foreground="Black">Enter Link Comment:</TextBlock> 
        <TextBox Grid.Column="1" Name="txtLinkComment" Width="200"></TextBox> 
       </Grid> 
      </Border> 
     </Popup> 
    </Grid> 
</Page> 

回答

1

我想这是因为弹出被弯曲到btnAddLinkComment.isChecked属性。我相信会发生什么情况是,当显示弹出窗口时点击该按钮会使其关闭,并将按钮的IsChecked字段设置为false,从而将该按钮置于非模糊状态;那么点击会被按钮本身处理,并且由于它没有被切换,它会变成切换状态,弹出窗口会再次显示。我想你可以通过删除绑定并在代码中进行一些处理来解决问题;水木清华这样的:

btnAddLinkComment.Click += btnAddLinkComment_Click; 
popAddCommentLink.Closed += popAddCommentLink_Closed; 

private void btnAddLinkComment_Click(object sender, RoutedEventArgs e) 
{ 
    if (popAddCommentLink.IsOpen && btnAddLinkComment.IsChecked == false) 
     popAddCommentLink.IsOpen = false; 
    else if (!popAddCommentLink.IsOpen && btnAddLinkComment.IsChecked == true) 
     popAddCommentLink.IsOpen = true; 
} 

private void popAddCommentLink_Closed(object sender, EventArgs e) 
{ 
    btnAddLinkComment.IsChecked = false; 
} 

希望这会有所帮助,至于

+0

+1。我认为这正是答案:)! – Anvaka 2009-12-16 06:31:59

+0

我希望这样做不需要添加代码。我想这是必需的 – Vaccano 2009-12-16 21:15:53

1

我不能完全肯定要完成,但下面的代码可能是在正确的方向迈出的一步是什么。请详细说明!

<Window x:Class="ToggleButtonSpike.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:local="clr-namespace:ToggleButtonSpike"> 
    <Window.Resources> 
     <local:TextToBool x:Key="StringToBool"/> 
    </Window.Resources> 
    <StackPanel> 
     <ToggleButton Name="Toggle" > 
      <CheckBox IsHitTestVisible="False" 
       Content="{Binding ElementName=Comment, Path=Text, 
       UpdateSourceTrigger=PropertyChanged}" 
       IsChecked="{Binding ElementName=Comment, Path=Text, 
       Converter={StaticResource StringToBool}}"/> 
     </ToggleButton> 
     <Popup IsOpen="{Binding ElementName=Toggle, Path=IsChecked}" 
       PlacementTarget="{Binding ElementName=Toggle}"> 
      <StackPanel> 
       <TextBlock Foreground="White"> 
        Enter comment: 
       </TextBlock> 
       <TextBox Name="Comment"/> 
      </StackPanel> 
     </Popup> 
    </StackPanel> 
</Window> 

using System; 
using System.Windows; 
using System.Windows.Data; 


namespace ToggleButtonSpike 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
    } 

    public class TextToBool : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return !string.IsNullOrEmpty((string)value); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 
} 
+0

我希望弹出窗口显示切换btn时,并再次点击时消失。我可以用代码来做到这一点,但我想用绑定来完成。 – Vaccano 2009-12-16 21:16:41

+0

上面的代码就是这么做的。它没有做的是按下输入按钮关闭弹出窗口。但一个鼠标点击工作。 – Dabblernl 2009-12-16 21:37:37

1

当你点击切换按钮。它会检查或不检查,请记住这一点。在第一次点击它时,它将被聚焦。 请尝试:

<ToggleButton Focusable="False"/> 

希望能帮助你

相关问题