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

时间:2015-06-03 18:33:00

标签: c# wpf xaml

<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>

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

2 个答案:

答案 0 :(得分:0)

非奇特的方式1:

xaml (x)名称空间具有以下属性:

x:FieldModifier="public"

所以你的代码:

<Canvas x:Name="canvas" x:FieldModifier="public" Width="640" Height="480" Margin="667,10,5,289"/>

现在,如果您的实例为MainWindow,则可以访问此canvas

非奇特的方式2:

在MainWindow.cs codebehind

中创建一个公共属性
public Canvas Canvas { get { return cica; } }

(如果你想变得很脏,可能是静态的)

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

答案 1 :(得分:0)

我刚刚为一个小练习创建了一个例子。我不确定它是否适合这里,因为我不知道你想要通过访问画布完成什么。无论如何让我们开始工作:

ViewModel的一个示例:

function onBefore(current, previous) {
  if (!CliendDateTimeUtils.validateCalendarDate(current.start_date)) {
    current.setAbortAction(true); // Don't save the record
    gs.addErrorMessage("Start date is not valid"); // Add an error message for the user
  }
}

简单的命令就在这里:

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);
    }
}

这可能是你的Canvas定义:

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;
    }
}

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

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

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