Errors while porting code to silverlight - c#

I have a C# class library project in my solution, in which I added a User Control and pasted the following code from my WPF application.
The xaml looks all fine, but I am getting certain errors on compiling. For eg:
1) System.Windows.DataFormats' does not contain a definition for 'StringFormat'
2) System.Windows.Controls.TextBlock' does not contain a definition for 'Background' and no extension method 'Background' accepting a first argument of type 'System.Windows.Controls.TextBlock' could be found
3) System.Windows.Media.Colors' does not contain a definition for 'LightCoral'
4) System.Windows.Controls.TextBlock' does not contain a definition for 'Background' and no extension method 'Background' accepting a first argument of type 'System.Windows.Controls.TextBlock' could be found (are you missing a using directive or an assembly reference?)
I am not sure why these errors are occuring and these are related to TextBox's background, Drag Drop, DataFormats etc. The .xaml.cs code is here as well. http://pastebin.com/CY8E8prz

You have to remove the properties referred to by the errors, because Silverlight simply doesn't have them or they have a different name (WPF and Silverlight aren't exactly the same, the former has more features than the latter).
A few examples:
To color the background of a TextBlock, you can wrap it in a Border (adjusting positioning/sizing attributes accordingly).
LightCoral looks like a color name, you'll have to look up something similar or use Color.FromArgb()
In short, copy-pasted code from WPF to Silverlight very rarely works as-is.

Textblock has no background in Silverlight, only WPF. I'm sure the rest of your errors follow suit. For that particular issue, place the textblock over another control or use a label instead. For the color, just look up the RGB and set it directly. I'm not sure on the other errors exactly.

Related

c# wpf, is xaml nested property/controls inheritance possible?

<Grid Name="mainSceneGrid" Grid.Row="1" Background="#FF075035">
<Grid Name="navigationGrid">
......
</Grid>
</Grid>
Normally from the code behind we would directly call navigationGrid.xxx which is very simple and effective. However when we start to get alot of dependent and nested grids for example it would be awesome to instead be able to call a property like this:
mainSceneGrid.navigationGrid.xxx
So we get some form of structured code and easier intellisense to work with, is this possible with xaml?
You misunderstand what the names of UI elements are.
For XAML, firstly, it is registering a name in the visual tree of elements using the FrameworkElement.RegisterName (String, Object) method and then searching in this tree using the FrameworkElement.FindName (String) method.
This is mainly used for bindings of type ElementName.
These names must be unique within the scope of the names.
Secondly, the x: Name Directive creates, in addition to the name in the visual tree, a field in the "* .g.i.cs" file.
This file is the XAML reflection generated by Studio Designer.
You can view it if you place the cursor on the call to the InitializeComponent () method and press F12.
It automatically changes when you change the XAML code.
And when you reference the name of an element in Code Behind, you are not actually referring to the name in XAML, but to a field in that file.
And if you know even a little about Sharpe, then you understand that you cannot create fields with names like name1.name2.
As for your problem, its origins are that you are not working with WPF in a way that is typical for WPF.
WPF is designed around the concept of UI elements getting values ​​for their properties on their own through bindings.
Therefore, using WPF element names other than ElementName bindings is a sign of incorrect implementation.
Such incorrect implementation methods are fraught with the occurrence of specific tasks, code bloat, and a high probability of bugs and errors.
I advise you, especially at the initial stage of training, in general, do not even open the "* .xaml.cs" files.
There should be nothing in the Code Behind other than calling the InitializeComponent () method.
When you learn the basics of WPF (layout, bindings, data context, styles, templates, triggers, converters), then you will be able to consciously decide on the use of Code Behind.
But in practice, there are almost no such tasks where it is really needed.

How can I modify the icon appearance of a custom toolbox item/user-control?

I inherited the CheckBox class to design a custom user control and I would like to specify the same icon image for my toolbox item like the default image that is shown for the Microsoft's WindowsForms CheckBox toolbox item.
To understand what I mean:
I think this would be possible using the ToolboxBitmap attribute, however I'm in the need to provide the assembly that contains the user control without additional files, so I can't use a local filepath to specify a custom image and the overload where lets you specify a Type/Assembly and what it seems a resource name I really don't know how I should use it.
Or maybe specifying the proper value in the ToolboxItem or the Designer attributes, however, I don't know how to do so.
If necessary, I know how to obtain the default checkbox image by downloading the Visual Studio Image Library but once I have the image and after adding it to the resources of my assembly I don't know what to do with it and with the ToolboxBitmap attribute.
This is the code I have done to get an idea, the commented lines are just things that I'm testing randomly to try solve this issue:
'<ToolboxBitmap()>
'<ToolboxItem("System.Drawing.Design.ToolboxItem, ???")>
'<Designer(GetType(CheckBox), GetType(IComponent))>
<DesignTimeVisible(True)>
<ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)>
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")>
Public Class ElektroCheckBox : Inherits CheckBox
End Class
PS: Please note that I have the same need to accomplish for other user controls that does not inherit from CheckBox class, so an extended help would be very gratefuly from my side if I can understand how to do the same I mean how I can specify for my toolbox item the default image of other controls like for example a Listview or a Listbox.

WPF name of image [duplicate]

Sometimes it seems that the Name and x:Name attributes are interchangeable.
So, what are the definitive differences between them, and when is it preferable to use one over the other?
Are there any performance or memory implications to using them the wrong way?
There really is only one name in XAML, the x:Name. A framework, such as WPF, can optionally map one of its properties to XAML's x:Name by using the RuntimeNamePropertyAttribute on the class that designates one of the classes properties as mapping to the x:Name attribute of XAML.
The reason this was done was to allow for frameworks that already have a concept of "Name" at runtime, such as WPF. In WPF, for example, FrameworkElement introduces a Name property.
In general, a class does not need to store the name for x:Name to be useable. All x:Name means to XAML is generate a field to store the value in the code behind class. What the runtime does with that mapping is framework dependent.
So, why are there two ways to do the same thing? The simple answer is because there are two concepts mapped onto one property. WPF wants the name of an element preserved at runtime (which is usable through Bind, among other things) and XAML needs to know what elements you want to be accessible by fields in the code behind class. WPF ties these two together by marking the Name property as an alias of x:Name.
In the future, XAML will have more uses for x:Name, such as allowing you to set properties by referring to other objects by name, but in 3.5 and prior, it is only used to create fields.
Whether you should use one or the other is really a style question, not a technical one. I will leave that to others for a recommendation.
See also AutomationProperties.Name VS x:Name, AutomationProperties.Name is used by accessibility tools and some testing tools.
They are not the same thing.
x:Name is a xaml concept, used mainly to reference elements. When you give an element the x:Name xaml attribute, "the specified x:Name becomes the name of a field that is created in the underlying code when xaml is processed, and that field holds a reference to the object." (MSDN) So, it's a designer-generated field, which has internal access by default.
Name is the existing string property of a FrameworkElement, listed as any other wpf element property in the form of a xaml attribute.
As a consequence, this also means x:Name can be used on a wider range of objects. This is a technique to enable anything in xaml to be referenced by a given name.
x:Name and Name are referencing different namespaces.
x:name is a reference to the x namespace defined by default at the top of the Xaml file.
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Just saying Name uses the default below namespace.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
x:Name is saying use the namespace that has the x alias. x is the default and most people leave it but you can change it to whatever you like
xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"
so your reference would be foo:name
Define and Use Namespaces in WPF
OK lets look at this a different way. Say you drag and drop an button onto your Xaml page. You can reference this 2 ways x:name and name. All xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" and
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" are is references to multiple namespaces. Since xaml holds the Control namespace(not 100% on that) and presentation holds the FrameworkElement AND the Button class has a inheritance pattern of:
Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement,
IInputElement, ISupportInitialize, IHaveResources
So as one would expect anything that inherits from FrameworkElement would have access to all its public attributes. so in the case of Button it is getting its Name attribute from FrameworkElement, at the very top of the hierarchy tree. So you can say x:Name or Name and they will both be accessing the getter/setter from the FrameworkElement.
MSDN Reference
WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XML namespace. The XmlnsDefinitionAttribute attribute is placed at the assembly level in the source code that produces the assembly. The WPF assembly source code uses this attribute to map the various common namespaces, such as System.Windows and System.Windows.Controls, to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.
So the assembly attributes will look something like:
PresentationFramework.dll - XmlnsDefinitionAttribute:
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]
They're both the same thing, a lot of framework elements expose a name property themselves, but for those that don't you can use x:name - I usually just stick with x:name because it works for everything.
Controls can expose name themselves as a Dependency Property if they want to (because they need to use that Dependency Property internally), or they can choose not to.
More details in msdn here and here:
Some WPF framework-level applications
might be able to avoid any use of the
x:Name attribute, because the Name
dependency property as specified
within the WPF namespace for several
of the important base classes such as
FrameworkElement/FrameworkContentElement
satisfies this same purpose. There are
still some common XAML and framework
scenarios where code access to an
element with no Name property is
necessary, most notably in certain
animation and storyboard support
classes. For instance, you should
specify x:Name on timelines and
transforms created in XAML, if you
intend to reference them from code.
If Name is available as a property on
the class, Name and x:Name can be used
interchangeably as attributes, but an
error will result if both are
specified on the same element.
X:Name can cause memory issues if you have custom controls. It will keep a memory location for the NameScope entry.
I say never use x:Name unless you have to.
Name:
can be used only for descendants of FrameworkElement and FrameworkContentElement;
can be set from code-behind via SetValue() and property-like.
x:Name:
can be used for almost all XAML elements;
can NOT be set from
code-behind via SetValue(); it can only be set using attribute
syntax on objects because it is a directive.
Using both directives in XAML for one FrameworkElement or FrameworkContentElement will cause an exception: if the XAML is markup compiled, the exception will occur on the markup compile, otherwise it occurs on load.
The only difference is that if you are using user Controls into a control from Same Assembly then Name will not identify your control and you will get an error " Use x:Name for controls in the same Assembly".
So x:Name is the WPF versioning of naming controls in WPF. Name is just used as a Winform Legacy. They wanted to differentiate the naming of controls in WPF and winforms as they use attributes in Xaml to identify controls from other assemblies they used x: for Names of control.
Just keep in mind dont put a name for a control just for the sake of keeping it as it resides in memory as a blank and it will give you a warning that Name has been applied for a control buts its never used.
x:Name means: create a field in the code behind to hold a reference to this object.
Name means: set the name property of this object.
I always use the x:Name variant.
I have no idea if this affects any performance, I just find it easier for the following reason.
If you have your own usercontrols that reside in another assembly just the "Name" property won't always suffice. This makes it easier to just stick too the x:Name property.
It's not a WPF item but a standard XML one and BtBh has correctly answered it, x refers to the default namespace. In XML when you do not prefix an element/attribute with a namespace it assumes you want the default namespace.
So typing just Name is nothing more than a short hand for x:Name. More details on XML namespaces can be found at link text
The specified x:Name becomes the name of a field that is created in the underlying code when XAML is processed, and that field holds a reference to the object. In Silverlight, using the managed API, the process of creating this field is performed by the MSBuild target steps, which also are responsible for joining the partial classes for a XAML file and its code-behind. This behavior is not necessarily XAML-language specified; it is the particular implementation that Silverlight applies to use x:Name in its programming and application models.
Read More on MSDN...
When you declare a Button element in XAML you are referring to a class defined in windows run time called Button.
Button has many attribute such as background, text, margin, ..... and an attribute called Name.
Now when you declare a Button in XAML is like creating an anonymous object that happened to have an attribute called Name.
In general you can not refer to an anonymous object, but in WPF framework XAML processor enables you to refer to that object by whatever value you have given to Name attribute.
So far so good.
Another way to create an object is create a named object instead of anonymous object. In this case XAML namespace has an attribute for an object called Name (and since it is in XAML name space thus have X:) that you may set so you can identify your object and refer to it.
Conclusion:
Name is an attribute of a specific object, but X:Name is one attribute of that object (there is a class that defines a general object).
One of the answers is that x:name is to be used inside different program languages such as c# and name is to be used for the framework. Honestly that is what it sounds like to me.
My research is x:Name as global variable. However, Name as local variable. Does that mean x:Name you can call it anywhere in your XAML file but Name is not.
Example:
<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
You can't Binding property Content of Button with Name is "btn" because it outside StackPanel
Name can also be set using property element syntax with inner text, but that is uncommon. In contrast, x:Name cannot be set in XAML property element syntax, or in code using SetValue; it can only be set using attribute syntax on objects because it is a directive.
If Name is available as a property on the class, Name and x:Name can be used interchangeably as attributes, but a parse exception will result if both are specified on the same element. If the XAML is markup compiled, the exception will occur on the markup compile, otherwise it occurs on load.

How to find incorrect binding during runtime or compile?

In this case code below binds non-existing field DeviceFamily to Text. Intentionally this field should to be enum with first Unknown value, so with set fallback also to Unknown it was not possible to determine that something is wrong (field DeviceFamily in class is just missing) without searching for this problem.
Is there any way to check if binded data invoke to non-existing fields?
<TextBlock Name="textBlock42" Text="{Binding Path=LatestPosition.DeviceFamily, FallbackValue=Unknown}"/>
I don't think there is any chance to have your bindings checked at compile time, but at runtime there are options:
first: you see your binding errors in the visual studio output
second: there is a tool called snoop:
if you do not know which binding fails
I would use snoop utility for this purposes. In short - in the top right corner you'll find dropdown list which allows filter visuals, just select visuals with binding error. See online documentation for more details.
(taken from this so answer)
third option: have binding errors visualized as message box popups as shown in this article
(taken from this so answer

Accessing TemplatePart without changing ControlTemplate?

i wonder if there is a way to access a control's templatepart from within c# for modifying the part (e.g. hiding, etc..). is it possible to get a reference to the part with pure c#?
i don't want to touch the controls template.
thanks
j.
It is possible, but its quite nasty.
On the Template there is a method called FindName, which needs two arguments: the name and the FrameworkElement that has the ControlTemplate as Template. Of course, you need to set the name of the element in the ControlTemplate...
Another more elegent solution is to use a Binding in the ControlTemplate to determine the visibility.. That way you do not need to do stuff in your code behind and you can keep it Xaml only...

Categories

Resources