字典TryGetValue

问题描述 投票:0回答:1

当用户离开我的应用程序时,我想在Windows手机中保留状态。 如何创建从字典中获取价值的通用方法TryGetValue

我的代码到目前为止:

    public class StatefulPhoneApplication : PhoneApplicationPage
    {
        #region constructor
        public StatefulPhoneApplication()
        {
            IsNewPageInstance = true;
        }
        #endregion

        #region properties
        protected bool IsNewPageInstance { get; private set; }
        protected bool IsStatePreserved
        {
            get
            {
                if (this.State.ContainsKey("StatePreserved"))
                    return (bool)this.State["StatePreserved"];
                else
                    return false;
            }
        }
        #endregion

        #region preservation methods
        protected void PreserveControlState(Control control)
        {
            if (control is TextBox)
                PreserveTextBoxState(control as TextBox);
            else
                PreserveCheckBoxState(control as CheckBox);

            this.State["StatePreserved"] = true;
        }

        protected void PreserveTextBoxState(TextBox textBox)
        {
            this.State[textBox.Name + ".Text"] = textBox.Text;
            this.State[textBox.Name + ".SelectionStart"] = textBox.SelectionStart;
            this.State[textBox.Name + ".SelectionLength"] = textBox.SelectionLength;
        }

        protected void PreserveCheckBoxState(CheckBox checkBox)
        {
            this.State[checkBox.Name + ".IsChecked"] = checkBox.IsChecked;
        }

        protected void PreserveFocusState(FrameworkElement parent)
        {
            Control focusedControl = FocusManager.GetFocusedElement() as Control;

            if (focusedControl == null)
            {
                this.State["FocusedControlName"] = null;
            }
            else
            {
                Control controlWithFocus = parent.FindName(focusedControl.Name) as Control;

                if (controlWithFocus == null)
                {
                    this.State["FocusedElementName"] = null;
                }
                else
                {
                    this.State["FocusedElementName"] = focusedControl.Name;
                }
            }   

        }
        #endregion

        #region restoration methods
        private void RestoreControlState(Control control)
        {
            if (control is TextBox)
                RestoreTextBoxState(control as TextBox, string.Empty);
            else if (control is CheckBox)
                RestoreCheckBoxState(control as CheckBox, false);
        }
        #endregion
    }

我想打电话就像这样。

    private void RestoreTextBoxState(TextBox textBox, string defaultValue)
    {
        textBox.Text = TryGetValue<string>(textBox.Name + ".Text", defaultValue);
        textBox.SelectionStart = TryGetValue<int>(textBox.Name + ".SelectionStart", defaultValue);
        textBox.SelectionLength = TryGetValue<int>(textBox.Name + ".SelectionLength", defaultValue);
    }

我找不到一个有效的好样本。

c# windows-phone-7 windows-phone-8
1个回答
2
投票

这是我使用的IDictionary的扩展方法:

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue @default = default(TValue)) {
    if (@this == null) return @default;

    TValue value;

    return @this.TryGetValue(key, out value) ? value : @default;
}

用法:

Dictionary<int, string> dict = new Dictionary<int, string>() {
    { 1, "one" },
    { 3, "three" }
};

string one = dict.GetValueOrDefault(1, "one");
string two = dict.GetValueOrDefault(2, "two");
string three = dict.GetValueOrDefault(3, "three");

在上面的代码之后,onetwothree都将被设置为正确的字符串值,即使字典没有密钥2的条目


要在没有扩展方法的情况下实现您想要的功能,您只需使用方法的主体:

string temp;
string two = dict.TryGetValue(2, out temp) ? temp : "two";
© www.soinside.com 2019 - 2024. All rights reserved.