Does naming objects in XAML impact anything? - c#

Does assigning the attribute "Name" have any impact on objects in XAML? All of the objects I want to provide a Name value for have currently have no Name value.

It will set the Name property on the class. If the XAML is associated with code-behind, the XAML compiler will also expose the named elements to the code-behind (assuming that Name maps to x:Name, which is true for most WPF controls you would represent with XAML.) You can also use x:Name explicitly if you have a class that doesn't support a Name property.

Related

Do i have to implement all usercontrol properties by interface in WPF?

I'm programming a bunch of WPF usercontrols (not CommonControls!) using an Interface for the common properties like the alignments or the Content (depending on the control; TextBox returns the Text, and Label the Content per example).
Now i get to controls like the Checkbox, which have the not so common property IsChecked.
Do i have to implement this property by the Interface or is it allowed to program it in the usercontrol itself?
I hope you're talking about binding a property to a view model or directly mentioning the property value in the xaml itself.
It actually depends upon your requirement. We normally bind a property value to a view model or code behind when that property needs to be checked by certain conditions and then to be set. If you're sure of the property's value, you can set it in xaml itself.
For example if you want to set a textbox's IsEnabled property, and you're sure that the text box is always editable. Then set it as true in xaml itself. But if you're text box need to be enabled during an event is handled, bind it to a property in view model and set it to true during the event trigger.
Okay, i have to guess it was a dumb question.
But after eight hours you don't know anymore, if you're Hillary or Donald.
The answer is: An Interface can inherit from another and implement all members from the "parent" interface.

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.

Change (or Centralise) Property Value for all Controls on a WPF Window

New to WPF so I'm sure it's an easy one this; for every control of a certain type/s, I want to set a property to the same value. The property is telerik:Theming.Theme and I would like to apply the same value to all telerik: controls. If there's no way to do this then how do I use a resource to define this value and refer to the resource in the controls?
Thanks.
You may override the default value of any dependency property for a specific control type (precisely a specific type of dependency object) by DependencyProperty.OverrideMetadata in your application initialization code (e.g. the static constructor of your MainWindow):
Telerik.Windows.Controls.Theming.ThemeProperty.OverrideMetadata(
typeof(SomeControlClass),
new PropertyMetadata(SomeDefaultValue));
where SomeControlClass is the (base) class that you want to give a new default value for the Theme property, and SomeDefaultValue is the new default value.
Note also that Theming.ThemeProperty seems to be obsolete and will be replaced by StyleManager.ThemeProperty.
You do not need to define a resource for binding, but you need to define a property on ModelView and bind it to every control.

How to access x:Name-property in code - for non FrameworkElement objects?

Similar to another question, I would like to access the x:Name property of an object through code, tough in this case the object in question is not a FrameworkElement and thus does not have a Name property. I do not have access to the member variable either.
In my situation, I have a ListView with named columns and would like to extend the ListView class so that it persists the column layout. For this functionality I need named columns, and it would make sense to me to re-use the x:Name property I need to set anyway for other reasons, instead of adding an attached "ColumnName" property for example.
My current "solution":
<GridViewColumn Header="X" localControls:ExtendedListView.ColumnName="iconColumn" />
Desired:
<GridViewColumn Header="X" x:Name="iconColumn" />
So is it possible to get the "x:Name" value somehow?
See the answers by IanG in the following thread:
How to read the x:Name property from XAML code in the code-behind
Unfortunately, that's not quite what x:Name does. x:Name isn't
technically a property - it's a Xaml directive. In the context of a
.NET WPF application, x:Name means this:
"I want to be able to have access to this object via a field of this
name. Also, if this type happens to have a name property, please set
it to that name."
It's that second part that you need, and unfortunately that second
part doesn't apply to ModelUIElement3D, because that type doesn't have
a property to represent the name. So in effect, all it means is "I
want to be able to have access to this object via a field of this
name." And that's all.
So, all x:Name does is that it gives you access to this object by creating a field with that specific name. If you want to get the x:Name of it, you'll have to iterate all your fields and see if the field is the object you're looking for, and in that case, return the field name.
He does present a method to do this in the code behind file, although I think your current approach with an attached property is a much better solution
public string GetName(GridViewColumn column)
{
var findMatch = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
let fieldValue = field.GetValue(this)
where fieldValue == column
select field.Name;
return findMatch.FirstOrDefault();
}

Is is possible to Create an Alias of a Form Control by Changing the name property

Suppose I have a ComboBox with name, myComboBox.
Now, if I declare another ComboBox reference, say:
ComboBox curBox=new ComboBox();
curBox.Name = curCombo; // curCombo is a string whose value is myComboBox.
Will curBox then be an alias for, that is directly refer to myComboBox.
The name property of a WPF control is just used to fill the name attribute in your XAML markup. It should be unique as it provides a (high-level) reference to your control (you can find your control by name).
In your example, myComboBox and curBox are two separate instances of a ComboBox, who will simply share the same name. This is not allowed as names should be unique within a Namescope. See here for more on this subject.
Rewinder is right, just want to add:
setting curBox.Name in code does not automatically add this control to the current Namescope. So, setting it should not be a problem. For adding it to the namescope you would use RegisterName which will throw an ArgumentException if the "name provided would result in a duplicate name registration".

Categories

Resources