我使用以下XAML构建了一个自定义控件
<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>当我用下面这一行手动将此代码添加到画布时,此控件中的按钮可以正常工作:
<Control:dbButtonControl Grid.Column="1" VerticalAlignment="Center" />但是,当我使用以下代码通过拖放动态添加它时:
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事件,这样我就可以在页面上单击并拖动控件。我禁用了此事件,控件中的按钮再次开始工作。所以它看起来像是我添加的预览鼠标按钮事件导致的。但我确实需要启用它,让控件中的按钮仍然有效。我该如何解决这个问题呢?
发布于 2020-09-01 04:46:50
事实证明,这是一个更复杂的问题,我想尝试通过应用程序和控件之间的事件处理来控制。所以我做的很简单...
我创建了一个包含自定义控件和“抓取”按钮的网格。
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映射到方法:
private void ImgGripper_MouseEnter(object sender, MouseEventArgs e)
{
Grid gdSender = (Grid)((Image)sender).Parent;
if (gdSender != null)
gdSender.PreviewMouseDown += CnvsLinkScreen_PreviewMouseDown;
}和
private void ImgGripper_MouseLeave(object sender, MouseEventArgs e)
{
Grid gdSender = (Grid)((Image)sender).Parent;
if (gdSender != null)
gdSender.PreviewMouseDown -= CnvsLinkScreen_PreviewMouseDown;
}这样,只有当鼠标位于较小的抓取区域上时,拖动选项才可用。
然后我修改了移动代码,使用控件移动创建的网格。一旦鼠标离开圆圈,控件的按钮将再次起作用。
https://stackoverflow.com/questions/63652824
复制相似问题