XAML中延迟变量声明

本文关键字:声明 变量 延迟 XAML | 更新日期: 2023-09-27 18:26:02

我正试图完成一个C#/XAML页面,但遇到了麻烦。基本上,当我尝试编译时,它抱怨变量的名称(Courier_List)在当前上下文中不存在。我从概念上理解为什么它还没有在代码中的任何地方声明。然而,我没有声明它的原因是,这个打包的.dll旨在与一个管理包(XML文件)一起工作,该管理包包含被定义为列表的定义(Courier_List),并包含指示可视化编译器将列表放置在表单上的位置的坐标。

我猜解决方案一定是以形式声明列表变量……但我不确定如何(以及它是否有效)只声明变量,而不在.dll中的任何地方使用它,然后当所有内容都放在一起时,它将从管理包中调用Courier_list,而不会在两个同名变量之间混淆。

我的描述可能令人困惑,因为很难解释,所以如果有人需要澄清,请告诉我。我已经包含了以下代码:

[assembly: CLSCompliant(true)]
namespace Flexity.RMA
{
  /// <summary>
  /// Interaction logic for UserControl1.xaml
  /// </summary>
  class RMATask : CreateWithLinkHandler
  {
      public RMATask()
      {
         try
         {
            // Sealed Class GUID
            this.createClassGuid = new Guid("9ebd95da-1b16-b9ea-274d-6b0c16ce1bf3");
            this.classToDelegate = new Dictionary<Guid, CreateLinkHelperCallback>()
            {
                { ApplicationConstants.WorkItemTypeId, new CreateLinkHelperCallback (this.WorkItemCallback) }
            };
         }
         catch (Exception exc1)
         {
            MessageBox.Show(exc1.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
         }
     }
     public void WorkItemCallback(IDataItem RMAForm, IDataItem IncidentForm)
     {
        try
        {
            // Note to self: RelatedWorkItems should be in MP XML as alias under TypeProjections
            if (RMAForm != null && RMAForm.HasProperty("RelatedWorkItems"))
            {
                // Perform Linking
                RMAForm["RelatedWorkItems"] = IncidentForm;
                // Copy Incident Title to RMA Title
                RMAForm["Title"] = IncidentForm["Title"];
                // Copy Incident Description to RMA Description
                RMAForm["Description"] = IncidentForm["Description"];
                // Copy Incident ID to RMA Display Name 
                RMAForm["DisplayName"] = "From " + IncidentForm["Id"];
            }
        }
        catch (Exception exc2)
        {
            MessageBox.Show(exc2.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}
public partial class WITemplate: UserControl
{
    private readonly RelatedItemsPane _relatedItemsPane;
    public WITemplate()
    {
        InitializeComponent();
        var paneConfig = new WorkItemRelatedItemsConfiguration("RelatedWorkItems", "RelatedWorkItemSource",
                                                           "RelatedConfigItems", "RelatedKnowledgeArticles",
                                                           "FileAttachments");
        _relatedItemsPane = new RelatedItemsPane(paneConfig);
        tabItemRelItems.Content = _relatedItemsPane;
    }
    private void Tracking_Button_Click(object sender, RoutedEventArgs e)
    {
        switch (Courier_List.SelectedValue.ToString())
        {
            case "UPS":
                System.Diagnostics.Process.Start("http://wwwapps.ups.com/ietracking/tracking.cgi?loc=CA_CA^&tracknum^=" + Tracking_Num.Text.ToString());
                break;
            case "FedEX":
                System.Diagnostics.Process.Start("https://www.fedex.com/fedextrack/index.html?tracknumbers^="+Tracking_Num.Text.ToString()+"^&locale=en_CA^&cntry_code=ca_english");
                break;
            case "UPS SCS":
                System.Diagnostics.Process.Start("https://www.upspostsaleslogistics.com/cfw/trackOrder.do?trackNumber^=" + Tracking_Num.Text.ToString());
                break;
            default:
                break;
        }
    }
 }
}

XAML中延迟变量声明

我认为您对显而易见的解决方案是正确的。按钮单击处理程序不知道管理包XML的内容,除非显式连接它们。

因此,您需要为该switch语句创建一个用于Tracking_Button_Click处理程序的变量。这是一种非常常见的模式;如果C#代码中某个地方需要资源,那么您必须有一两行代码来查找资源并将其分配给您声明的变量。

如果操作正确,将不会复制数据。相反,系统将设置对现有类的引用。这反过来将允许您在C#代码中使用管理包XML。

我没有你的管理包的例子,但这里有其他几个遵循模式的例子。如果你想获得XAML资源,你可以做一些类似的事情:

var myList = (XAMLResourceType) this.TryFindResource("myResourceKey");

您不需要完全这样,,但在处理程序的代码中需要非常类似的。然后您的switch语句将起作用。