首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按钮在添加到画布时将失去其事件绑定。

按钮在添加到画布时将失去其事件绑定。
EN

Stack Overflow用户
提问于 2020-08-30 07:55:19
回答 1查看 32关注 0票数 0

我使用以下XAML构建了一个自定义控件

代码语言:javascript
复制
<StackPanel Name="spTop">
    <Button Name="btnDBConfiguration" HorizontalAlignment="Center" Background="Transparent" HorizontalContentAlignment="Left" MouseEnter="btnDBConfiguration_MouseEnter" MouseLeave="btnDBConfiguration_MouseLeave"  >
        <StackPanel Orientation="Vertical">
            <Image Source="/Images/DBImport25px.png" Width="40" Height="40" VerticalAlignment="Center" HorizontalAlignment="Center" Name="imgVerify"></Image>
            <TextBlock Foreground="AntiqueWhite" Background="Black" VerticalAlignment="Center" Name="tblkConnectionName" >Database</TextBlock>
        </StackPanel>
    </Button>
    <!--
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" Name="DBImport">
        <Image Source="/Images/DBImport25px.png" VerticalAlignment="Center" HorizontalAlignment="Center"></Image>
        <TextBlock Text="Database" Foreground="AntiqueWhite"/>
    </StackPanel>-->
    <Border BorderBrush="Gray" BorderThickness="1"  Width="50">
        <StackPanel Orientation="Horizontal" Name="spButtonBar" MouseEnter="btnDBConfiguration_MouseEnter" MouseLeave="btnDBConfiguration_MouseLeave" >
            <Button Name="btnDBConnection" HorizontalAlignment="Left" Background="Transparent"   HorizontalContentAlignment="Left" ToolTip="DB Connection" Click="btnDBConnection_Click" >
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                <Image Source="/Images/dbConfig25px.png" VerticalAlignment="Center" HorizontalAlignment="Left" Name="imgDBConnection"></Image>
            </StackPanel>
        </Button>
    </StackPanel>
</Border>
</StackPanel>

当我用下面这一行手动将此代码添加到画布时,此控件中的按钮可以正常工作:

代码语言:javascript
复制
        <Control:dbButtonControl Grid.Column="1" VerticalAlignment="Center" />

但是,当我使用以下代码通过拖放动态添加它时:

代码语言:javascript
复制
        dbButtonControl cntrlDBButton = new dbButtonControl();
        cntrlDBButton.SetNameText(ObjectTitle);
        cntrlDBButton.PreviewMouseDown += CnvsLinkScreen_PreviewMouseDown;

        Canvas.SetLeft(cntrlDBButton, pntEnterPoint.X);
        Canvas.SetTop(cntrlDBButton, pntEnterPoint.Y);

        cnvsLinkScreen.Children.Add(cntrlDBButton);

自定义控件中的按钮不再起作用。我添加了一个previewmousedown事件,这样我就可以在页面上单击并拖动控件。我禁用了此事件,控件中的按钮再次开始工作。所以它看起来像是我添加的预览鼠标按钮事件导致的。但我确实需要启用它,让控件中的按钮仍然有效。我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 04:46:50

事实证明,这是一个更复杂的问题,我想尝试通过应用程序和控件之间的事件处理来控制。所以我做的很简单...

我创建了一个包含自定义控件和“抓取”按钮的网格。

代码语言:javascript
复制
        Grid gdTab = new Grid();
        //gdTab.Name = ObjectTitle;
        Image imgGripper = new Image();
        imgGripper.Source = new BitmapImage(new Uri(@"pack://application:,,,/images/Dot25px.png", UriKind.Absolute));
        imgGripper.Width = 15;
        imgGripper.Height = 15;
        imgGripper.VerticalAlignment = VerticalAlignment.Top;
        imgGripper.HorizontalAlignment = HorizontalAlignment.Left;
        imgGripper.MouseEnter += (s,e) => Mouse.OverrideCursor = Cursors.Hand;
        imgGripper.MouseLeave += (s, e) => Mouse.OverrideCursor = Cursors.Arrow;
        imgGripper.MouseEnter += ImgGripper_MouseEnter;
        imgGripper.MouseLeave += ImgGripper_MouseLeave;

        Canvas.SetLeft(gdTab, pntEnterPoint.X);
        Canvas.SetTop(gdTab, pntEnterPoint.Y);
        gdTab.Children.Add(cntrlDBButton);
        gdTab.Children.Add(imgGripper);
        cnvsLinkScreen.Children.Add(gdTab);

然后,我将MouseEnter和MouseLeave映射到方法:

代码语言:javascript
复制
    private void ImgGripper_MouseEnter(object sender, MouseEventArgs e)
    {
        Grid gdSender = (Grid)((Image)sender).Parent;
        if (gdSender != null)
            gdSender.PreviewMouseDown += CnvsLinkScreen_PreviewMouseDown;
    }

代码语言:javascript
复制
    private void ImgGripper_MouseLeave(object sender, MouseEventArgs e)
    {
        Grid gdSender = (Grid)((Image)sender).Parent;
        if (gdSender != null)
            gdSender.PreviewMouseDown -= CnvsLinkScreen_PreviewMouseDown;
    }

这样,只有当鼠标位于较小的抓取区域上时,拖动选项才可用。

然后我修改了移动代码,使用控件移动创建的网格。一旦鼠标离开圆圈,控件的按钮将再次起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63652824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档