Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在主窗口类之外使用变量_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在主窗口类之外使用变量

C# 如何在主窗口类之外使用变量,c#,wpf,xaml,C#,Wpf,Xaml,这是我的XAML代码。我想在主窗口类之外使用canvas变量。我不知道如何在MainWindow.cs之外使用该变量,这是一种非常规的方式1: xaml(x)命名空间具有其属性: <Window x:Class="ShelfMapping.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft

这是我的XAML代码。我想在主窗口类之外使用
canvas
变量。我不知道如何在
MainWindow.cs

之外使用该变量,这是一种非常规的方式1:
xaml
(x)命名空间具有其属性:

<Window x:Class="ShelfMapping.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Shelf Mapping" Height="800" Width="1320"
        Loaded="Window_Loaded" Unloaded="Window_Unloaded">
    <Grid>
        <Image Name="camera" Width="640" Height="480" Margin="10,10,662,279" />

        <Image Name="depthOut"  Height="480"  Width="640" Margin="667,10,5,289"/>
        <Canvas Name="canvas" Width="640" Height="480" Margin="667,10,5,289"/>
        <Button Content="Screenshot" HorizontalAlignment="Left" Margin="298,649,0,0" VerticalAlignment="Top" Width="75" Click="buttonScreenshotClick"/>
        <TextBox Name="txtCode" HorizontalAlignment="Left" Height="101" Margin="901,514,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="223"/>
        <Button Content="OCR" HorizontalAlignment="Left" Margin="486,649,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.205,0.304" Click="click_OCR"/>

    </Grid>
</Window>
因此,您的代码:

x:FieldModifier="public"
(如果你真的想变得很脏的话,可能是静电干扰)



附言:评论是对的。您的设计有问题

我刚刚创建了一个示例,供您稍加练习。我不确定它是否适合这里,因为我不知道通过访问画布您想要实现什么。无论如何,让我们开始工作:

ViewModel的一个示例:

public Canvas Canvas { get { return cica; } }
简单的命令就在这里:

public class ViewModel : DependencyObject
{
    public ICommand ChangeWidthCommand { get; set; }

    public int CanvasWidth
    {
        get { return (int)GetValue(CanvasWidthProperty); }
        set { SetValue(CanvasWidthProperty, value); }
    }

    // Using a DependencyProperty as the backing store for CanvasWidth.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty CanvasWidthProperty =
        DependencyProperty.Register("CanvasWidth", typeof(int), typeof(ViewModel), new PropertyMetadata(0));

    public ViewModel()
    {
        ChangeWidthCommand = new ChangeWidthCommand(this);
    }
}
这可能是您的画布定义:

public class ChangeWidthCommand : ICommand
{
    ViewModel vm { get; set; }

    public ChangeWidthCommand(ViewModel _vm)
    {
        vm = _vm;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        vm.CanvasWidth += 10;
    }
}

那我到底在这里干什么?只需通过该自定义命令访问窗口类外部的画布,以便在单击按钮时更改其宽度

其实没什么大不了的,只需将模型作为命令的参考发送即可。您可以选择在命令类实现中定义一些委托,并在构造函数中将方法名称作为参数发送


我想今晚就这样了。玩得开心

外面和里面一样?窗口本身是控件的主容器。如何调用此窗口?在另一个类中,我想使用变量“canvas”。您不应该从窗口外部访问窗口的内容。让它从外部实体封装其内容。正如@Servy所说,如果您需要这样做,那么这可能是您的设计有问题的迹象。查阅MVVM以更好地了解如何构造代码。您的画布是视图的一部分,应该在该视图之外使用。如果你必须拥有它,那么你需要在你的
主窗口
类中有一个公共属性来公开它。设计警告是真实的,应该加以考虑,但是如果一种方法是在你想要的另一个类上拥有一个属性并在其上注册控件。公共TextBoxMainWindow{get;set;}
public class ChangeWidthCommand : ICommand
{
    ViewModel vm { get; set; }

    public ChangeWidthCommand(ViewModel _vm)
    {
        vm = _vm;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        vm.CanvasWidth += 10;
    }
}
 <Canvas x:Name="drawSplice" Width="{Binding CanvasWidth}" Height="200"  Background="SlateBlue">
    <Canvas.DataContext>
        <local:ViewModel/>
    </Canvas.DataContext>
    <Button Content="Change width" Command="{Binding ChangeWidthCommand}" Canvas.Top="220" Canvas.Left="-30"/>
</Canvas>