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;
}
}
}
}
我认为您对显而易见的解决方案是正确的。按钮单击处理程序不知道管理包XML的内容,除非显式连接它们。
因此,您需要为该switch语句创建一个用于Tracking_Button_Click
处理程序的变量。这是一种非常常见的模式;如果C#代码中某个地方需要资源,那么您必须有一两行代码来查找资源并将其分配给您声明的变量。
如果操作正确,将不会复制数据。相反,系统将设置对现有类的引用。这反过来将允许您在C#代码中使用管理包XML。
我没有你的管理包的例子,但这里有其他几个遵循模式的例子。如果你想获得XAML资源,你可以做一些类似的事情:
var myList = (XAMLResourceType) this.TryFindResource("myResourceKey");
您不需要完全这样,,但在处理程序的代码中需要非常类似的。然后您的switch
语句将起作用。