Аргумент вне допустимого диапазона Геометрия windows phone 8.1

Я пытаюсь заполнить кнопку путем и получить аргумент вне допустимого диапазона. Я привязываю свое представление к свойству модели. Код свойства:

public PunishmentName Name { get; set; }
public Geometry IconData 
{
    get
    {
        string data = "";
        switch (Name) 
        {
            case PunishmentName.Freeze:
                data = "M 0 0 Q 10 10 20 0";                                               
                break;
        }

        Path path = XamlReader.Load("<Path " + "xmlns=" + "'" + "http://schemas.microsoft.com/winfx/2006/xaml/presentation" + "'" + "  Data= '" + data + " '/>") as Path;
        Geometry geometry = path.Data;
        return geometry;
    }
}

код кнопки в представлении

<Button Grid.Row="1" BorderBrush="Transparent" >
    <Viewbox>
        <Path Data="{Binding Punishment.IconData}"/>
    </Viewbox>
</Button>

Я знаю этот вопрос: его уже задавали здесь: Windows Phone 7: как анализировать строку пути Безье, как в XAML?

Я попытался поместить путь в сетку и холст, а также с тем же результатом.

Но там это не решается ... И я здесь новичок, поэтому я не могу комментировать и не чувствую себя комфортно, задавая вопрос в качестве ответа. Я застрял здесь. Я могу придумать обходной путь, но это будет означать гораздо больше работы и более уродливый код...

Исключение:

{System.Windows.ApplicationUnhandledExceptionEventArgs}
    base: {System.Windows.ApplicationUnhandledExceptionEventArgs}
    ExceptionObject: {System.ArgumentException: Value does not fall within the expected range.
   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh)
   at MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj)
   at System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value)
   at System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp)
   at System.Windows.Data.BindingExpression.SendDataToTarget()
   at System.Windows.Data.BindingExpression.SourceAcquired()
   at System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(Object sender, DataContextChangedEventArgs e)
   at System.Windows.Data.BindingExpression.DataContextChanged(Object sender, DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.OnDataContextChanged(DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.OnAncestorDataContextChanged(DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.NotifyDataContextChanged(DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.OnAncestorDataContextChanged(DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.NotifyDataContextChanged(DataContextChangedEventArgs e)
   at System.Windows.FrameworkElement.OnTreeParentUpdated(DependencyObject newParent, Boolean bIsNewParentAlive)
   at System.Windows.DependencyObject.UpdateTreeParent(IManagedPeer oldParent, IManagedPeer newParent, Boolean bIsNewParentAlive, Boolean keepReferenceToParent)
   at MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate(IntPtr oldParentElement, IntPtr parentElement, IntPtr childElement, Byte bIsParentAlive, Byte bKeepReferenceToParent, Byte bCanCreateParent)}
    Handled: false

Я сделал то же самое в приложении WPF с Geometry.Parse, но это все еще недоступно для телефона...


person David Bijttebier    schedule 24.09.2014    source источник
comment
Есть встроенный преобразователь - так что вам не нужно IconData быть Geometry - сделайте его public string IconData и в геттере return data (например, data = M 0 0 Q 10 10 20 0) - это тоже должно работать.   -  person Romasz    schedule 25.09.2014
comment
Это все? stackoverflow.com/questions/22119053/   -  person dbc    schedule 25.09.2014
comment
спасибо dbc и всем, Ромаш дал решение.   -  person David Bijttebier    schedule 25.09.2014


Ответы (2)


Я думаю, вам может понадобиться дать остальную часть кода, чтобы увидеть, где вы ошибаетесь. Я написал этот код для Windows Phone 8.1 WinRT, и он отлично работал:

<Grid>
    <Button Grid.Row="1" BorderBrush="Transparent" >
        <Viewbox>
            <Path Data="{Binding IconData}"/>
        </Viewbox>
    </Button>
</Grid>



public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = NavigationCacheMode.Required;
        Punishment MyPunishment = new Punishment();
        MyPunishment.Name = Punishment.PunishmentName.Freeze;
        this.DataContext = MyPunishment;
    }
}

public class Punishment
{
    public enum PunishmentName { Freeze, Burn };
    public PunishmentName Name { get; set; }
    public Geometry IconData
    {
        get
        {
            string data = "";
            switch (Name)
            {
                case PunishmentName.Freeze:
                    data = "M 0 0 Q 10 10 20 0";
                    break;
            }
            Path path = XamlReader.Load("<Path " + "xmlns=" + "'" + "http://schemas.microsoft.com/winfx/2006/xaml/presentation" + "'" + "  Data= '" + data + " '/>") as Path;
            Geometry geometry = path.Data;
            return geometry;
        }
    }
}
person Matt Small    schedule 24.09.2014
comment
Спасибо, немного сложно дать больше кода. Какой именно код вы имеете в виду? Я устанавливаю контекст данных модели представления в коде, аналогичном вашему. Простой способ this.DataContext = ... strang, кстати, у вас отлично работает. Таким образом, конечно, это будет мой код... - person David Bijttebier; 24.09.2014
comment
единственная разница, которую я вижу, это то, что я не могу установить режим кэширования навигации, никогда этого не делал - person David Bijttebier; 24.09.2014

Ромаш дал ответ. Нет необходимости привязываться к Geometry. Строка в порядке... Я думал, что это необходимо в WPF, отсюда и путаница... спасибо, Ромаш

person David Bijttebier    schedule 24.09.2014