问题描述
我正在使用Caliburn.Micro MVVM Framework在Wpf项目中工作。我有个问题 。我做了一个自定义用户控件来缩放图片。它具有MouseDown和MouseMove事件。该事件在另一个类名称的“缩放边框”中。我在父Custom Made控件中有子图像。图像具有三个事件MouseDown,MouseMove和Mouse UP。因为我想计算不同点的坐标。我有一个menucontrol和2个选项Zoom和Image Measurement。当“缩放控制”菜单选择“我缩放图片”时,选择“图像测量”时,我计算图像的坐标。我尝试使用启用和禁用,但是当disbale父控件失灵时,我无法访问Child Event。所以我试图使用布尔值,但那也不起作用。您能给我个想法还是代码示例我该怎么做。这是我的代码...
<utils:ZoomBorder x:Name="ZoomBorder" Visibility="{Binding Path=IsDiIMGVisible,Converter={StaticResource Converter}}" IsEnabled="{Binding IsEnableZoom}" ClipToBounds="True" Background="Gray" Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="4">
<Canvas Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="4" IsEnabled="{Binding IsEnableCanvas}" Visibility="{Binding Path=ISCanvasVisible,Converter={StaticResource Converter}}">
<Image Source="{Binding DIIMGFINAL}" cal:Message.Attach="[Event MouseDown] = [Action MDowncalculatedistance($source,$eventArgs)];
[Event MouseUp] = [Action MUpCalculatedistance($source,$eventArgs)];
[Event MouseMove] = [Action MMoveCalculatedistance($source,$eventArgs)]"/>
<Line IsHitTestVisible="False" X1="{Binding FirstPoint.X}" Y1="{Binding FirstPoint.Y}"
X2="{Binding SecondPoint.X}" Y2="{Binding SecondPoint.Y}"
stroke="Red" strokeThickness="3"/>
</Canvas>
</utils:ZoomBorder>
这是我的ZoomBorder类
public class ZoomBorder : Border
{
private UIElement child = null;
private Point origin;
private Point start;
private TranslateTransform GetTranslateTransform(UIElement element)
{
return (TranslateTransform)((TransformGroup)element.RenderTransform)
.Children.First(tr => tr is TranslateTransform);
}
private ScaleTransform GetScaleTransform(UIElement element)
{
return (ScaleTransform)((TransformGroup)element.RenderTransform)
.Children.First(tr => tr is ScaleTransform);
}
public override UIElement Child
{
get { return base.Child; }
set
{
if (value != null && value != this.Child)
this.Initialize(value);
base.Child = value;
}
}
public void Initialize(UIElement element)
{
this.child = element;
if (child != null)
{
TransformGroup group = new TransformGroup();
ScaleTransform st = new ScaleTransform();
group.Children.Add(st);
TranslateTransform tt = new TranslateTransform();
group.Children.Add(tt);
child.RenderTransform = group;
child.RenderTransformOrigin = new Point(0.0,0.0);
this.MouseWheel += child_MouseWheel;
this.MouseLeftButtonDown += child_MouseLeftButtonDown;
this.MouseLeftButtonUp += child_MouseLeftButtonUp;
this.MouseMove += child_MouseMove;
this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(
child_PreviewMouseRightButtonDown);
}
}
public void Reset()
{
if (child != null)
{
// reset zoom
var st = GetScaleTransform(child);
st.ScaleX = 1.0;
st.ScaleY = 1.0;
// reset pan
var tt = GetTranslateTransform(child);
tt.X = 0.0;
tt.Y = 0.0;
}
}
#region Child Events
private void child_MouseWheel(object sender,MouseWheelEventArgs e)
{
if (child != null)
{
var st = GetScaleTransform(child);
var tt = GetTranslateTransform(child);
double zoom = e.Delta > 0 ? .2 : -.2;
if (!(e.Delta > 0) && (st.ScaleX < .4 || st.ScaleY < .4))
return;
Point relative = e.GetPosition(child);
double abosuluteX;
double abosuluteY;
abosuluteX = relative.X * st.ScaleX + tt.X;
abosuluteY = relative.Y * st.ScaleY + tt.Y;
st.ScaleX += zoom;
st.ScaleY += zoom;
tt.X = abosuluteX - relative.X * st.ScaleX;
tt.Y = abosuluteY - relative.Y * st.ScaleY;
}
}
private void child_MouseLeftButtonDown(object sender,MouseButtonEventArgs e)
{
if (child != null)
{
var tt = GetTranslateTransform(child);
start = e.GetPosition(this);
origin = new Point(tt.X,tt.Y);
this.Cursor = Cursors.Hand;
child.CaptureMouse();
}
}
private void child_MouseLeftButtonUp(object sender,MouseButtonEventArgs e)
{
if (child != null)
{
child.ReleaseMouseCapture();
this.Cursor = Cursors.Arrow;
}
}
void child_PreviewMouseRightButtonDown(object sender,MouseButtonEventArgs e)
{
this.Reset();
}
private void child_MouseMove(object sender,MouseEventArgs e)
{
if (child != null)
{
if (child.IsMouseCaptured)
{
var tt = GetTranslateTransform(child);
Vector v = start - e.GetPosition(this);
tt.X = origin.X - v.X;
tt.Y = origin.Y - v.Y;
}
}
}
#endregion
}
这里是用于增强缩放或图像计算的菜单控件
<Menu Grid.ColumnSpan="3" Grid.Column="1" Grid.Row="0" Background="Transparent" >
<MenuItem x:Name="ZoomControl" Header="Zoom">
<!--Item For Zoom-->
</MenuItem>
<MenuItem x:Name="Img_Measurement" Header="Image Measurement">
<!--Item For Measure-->
</MenuItem>
</Menu>
这与菜单对应的事件
public void ZoomControl()
{
//For Only Zoom
ISCanvasVisible = false;
IsDiIMGVisible = true;
IsEnableZoom = true;
IsEnableCanvas = false;
disTanceInMM = 0;
MessageBox.Show("Zoom Control Starts","Alert",MessageBoxButton.OK,MessageBoxImage.Exclamation);
}
public void Img_Measurement()
{
//IsDiIMGVisible = false;
IsDiIMGVisible = false;
ISCanvasVisible = true;
IsEnableZoom = false;
IsEnableCanvas = true;
MessageBox.Show("Image Measurement Starts",MessageBoxImage.Exclamation);
}
这是我按下鼠标,向上移动鼠标的图像事件
public void MDowncalculatedistance(object sender,System.Windows.Input.MouseEventArgs e)
{
if (IsEnableCanvas == false) return;
if (!(sender is System.Windows.Controls.Image)) return;
else if (IsEnableCanvas == true){}
try{
//Code Here
}
Catch(Exception ex){
//code here
}
}
}
public void MUpCalculatedistance(object sender,System.Windows.Input.MouseEventArgs e)
{
if (ISCanvasVisible == false) return;
_firstPoint = new System.Windows.Point(0,0);
_secondPoint = new System.Windows.Point(0,0);
}
public void MMoveCalculatedistance(object sender,System.Windows.Input.MouseEventArgs e) //Mouse Move Event
{
if (ISCanvasVisible == false) return;
if (!(sender is System.Windows.Controls.Image)) return;
try
{
//Code Here
}
catch(Exception ex){
//Code
}
}
我认为在Zoomborder类中,我需要通过,但是您能如何帮助我。提前致谢。我对在enable child control while Custom parent is disabled in wpf C#中启用和禁用功能提出了疑问,但是我认为我可以在ZoomBorder中传递一些值,并且只能禁用它。可以吗
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)