Для.NET 2.0, вот хороший бит кода, я записал, что это делает точно, что Вы хотите, и работы для любого свойства на Control
:
private delegate void SetControlPropertyThreadSafeDelegate(
Control control,
string propertyName,
object propertyValue);
public static void SetControlPropertyThreadSafe(
Control control,
string propertyName,
object propertyValue)
{
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate
(SetControlPropertyThreadSafe),
new object[] { control, propertyName, propertyValue });
}
else
{
control.GetType().InvokeMember(
propertyName,
BindingFlags.SetProperty,
null,
control,
new object[] { propertyValue });
}
}
Вызов это как это:
// thread-safe equivalent of
// myLabel.Text = status;
SetControlPropertyThreadSafe(myLabel, "Text", status);
при использовании.NET 3.0 или выше Вы могли бы переписать вышеупомянутый метод как дополнительный метод Control
класс, который тогда упростит вызов до:
myLabel.SetPropertyThreadSafe("Text", status);
ОБНОВЛЕНИЕ 10.05.2010:
Для.NET 3.0 необходимо использовать этот код:
private delegate void SetPropertyThreadSafeDelegate<TResult>(
Control @this,
Expression<Func<TResult>> property,
TResult value);
public static void SetPropertyThreadSafe<TResult>(
this Control @this,
Expression<Func<TResult>> property,
TResult value)
{
var propertyInfo = (property.Body as MemberExpression).Member
as PropertyInfo;
if (propertyInfo == null ||
!@this.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
@this.GetType().GetProperty(
propertyInfo.Name,
propertyInfo.PropertyType) == null)
{
throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control.");
}
if (@this.InvokeRequired)
{
@this.Invoke(new SetPropertyThreadSafeDelegate<TResult>
(SetPropertyThreadSafe),
new object[] { @this, property, value });
}
else
{
@this.GetType().InvokeMember(
propertyInfo.Name,
BindingFlags.SetProperty,
null,
@this,
new object[] { value });
}
}
, который использует LINQ и лямбда-выражения для разрешения намного более чистого, более простого и более безопасного синтаксиса:
myLabel.SetPropertyThreadSafe(() => myLabel.Text, status); // status has to be a string or this will fail to compile
Не только имя свойства, теперь проверенное во время компиляции, тип свойства также, таким образом, невозможно (например), присвоить строковое значение булево свойству и следовательно вызвать исключение на этапе выполнения.
, К сожалению, это не мешает никому делать глупые вещи, такие как передача в другом Control
свойство и значение, таким образом, следующее счастливо скомпилирует:
myLabel.SetPropertyThreadSafe(() => aForm.ShowIcon, false);
Следовательно я добавил проверки на этапе выполнения, чтобы гарантировать, что переданный - в свойстве действительно на самом деле принадлежит Control
что то, что метод был обращенным. Не прекрасный, но еще намного лучше, чем.NET 2,0 версии.
, Если у кого-либо есть дальнейшие предложения о том, как улучшить этот код для безопасности времени компиляции, прокомментируйте!
Я прочитал много документации по удобству использования, в которой говорится, что конечные пользователи негодуют, когда заставляют открывать ссылку в новом окне. Я склонен согласиться, если мне нужно новое окно, я щелкну правой кнопкой мыши и выберу то же окно, новую вкладку или новое окно.
Однако маркетологи считают, что открытие внешней ссылки в новом окне приведет к удерживайте конечных пользователей на своем сайте, потому что они в конечном итоге закроют новое окно и вернутся на ваш сайт.
РЕДАКТИРОВАТЬ: Лучшая информация, которую я прочитал по этой теме, находится в книге Стива Круга «Не заставляйте меня думать» ( веб-сайт ).
Most people will say to leave it out, all for very good reasons.
Most people will not tell you this: watch how different people browse using their computer. Sit down for an hour with an average user: a teacher, a piano player, a retired Vet, a stay-at-home mother, or a mechanic. Watch how people who are disabled browse.
You will discover that you should not:
You will discover that you should:
And much more.
MHO: просто свяжите это. Если я хочу открыть ссылку в новом окне, я могу сделать это сам.
Не указывайте целевой атрибут и позвольте пользователям решать, хотят ли они открывать ссылку в новом окне. Если вы хотите предупредить пользователя о том, что ссылка уведет его с вашего сайта, вы можете создать страницу, которая проясняет это (например, на сайтах правительства США).
Я согласен с тем, что как пользователь, я предпочитаю иметь выбор, открывать ли я ссылка в новом окне. К сожалению, многие пользователи не осознают, что у них есть такой выбор, и теряют ваш веб-сайт, когда щелкают ссылку на внешний сайт. Я склонен проявлять осторожность и открывать внешние ссылки в новых окнах, но на самом деле это зависит от вашей аудитории.
Here is a nice write up for not opening links in a new window/tab from Smashing Magazine. Essentially, it is better to give users control over link behavior than to decide for them.
Usability guru (?) Jakob Nielsen suggests not opening new browser windows (It's 10 years old though).
Quote:
Opening up new browser windows is like a vacuum cleaner sales person who starts a visit by emptying an ash tray on the customer's carpet. Don't pollute my screen with any more windows, thanks (particularly since current operating systems have miserable window management). If I want a new window, I will open it myself!
Designers open new browser windows on the theory that it keeps users on their site. But even disregarding the user-hostile message implied in taking over the user's machine, the strategy is self-defeating since it disables the Back button which is the normal way users return to previous sites. Users often don't notice that a new window has opened, especially if they are using a small monitor where the windows are maximized to fill up the screen. So a user who tries to return to the origin will be confused by a grayed out Back button.
And, every rule has an exception: He suggests document like PDF or DOC that are opened in the browser should be opened in new windows, to avoid confusion.
Стоит отметить, что цель
в любом случае недопустима в XHTML.
Это зависит от того, как правило, для ссылок на дополнительный контент на вашем сайте я бы не использовал _blank. Каждый раз, когда я ссылаюсь на сторонний контент, я использую _blank, чтобы страница моего сайта оставалась открытой. Таким образом, когда пользователь закончит работу с внешним сайтом, он снова увидит мой сайт.
В современных браузерах обычно открывается новая вкладка. Я ожидаю такого поведения, но обычно я контролирую щелчок, чтобы открыть новую вкладку / окно, когда я хочу сохранить свое место.
При этом для веб-приложения я всегда оставляю целевой атрибут отключенным, чтобы пользователь мог решать открывать новое окно или нет.
Люди ненавидят открывать ссылки в новом окне и не знать, что они появятся. Для каждой внешней ссылки используйте target = "_ blank", но добавьте значок, предлагающий открыть новое окно. Двойной квадратный значок Википедии является хорошим примером этого, так что вы можете просто взять его у них и извлечь выгоду из грамотности, которая уже есть у пользователей.
Что хорошо в значке «нового окна», так это то, что у пользователей есть возможность выбрать вместо этого открытие в новой вкладке, что не так навязчиво. Я бы также сказал, что многие из тех, кто яростно спорят против предлагаемого вами подхода, смотрят на него строго с точки зрения эстетики / удобства использования, а не с точки зрения бизнес-требований или функциональности вашего собственного приложения.
Если вы думаете, что вы или ваши пользователи выиграете от удержания пользователей на вашем сайте и открытия внешних ссылок в новом окне, вы должны сделать последний призыв по этому поводу. Просто относитесь к этому с уважением.
Вы должны учитывать, что пользователи делают в вашем окне, когда решаете, как должны вести себя ссылки. Если я потенциально могу потерять много работы при переходе на другую страницу, тогда мне может понадобиться открывать ссылки в новых окнах или дать мне возможность отменить.
Например, если я составляю сообщение в Gmail, большинство ссылок показывают диалог подтверждения, поэтому я случайно не потеряю свою работу. А ссылки вверху, которые ведут к другим приложениям, таким как Календарь, открываются в новых окнах. Я думаю, это хороший пример для подражания.
Думаю, это зависит от ситуации. Для простого веб-сайта с несколькими ссылками, например, о нас, контактах, услугах и т. Д., Я не буду открывать новое окно. Пользователю легко узнать, на какой странице он находится и какую страницу только что просмотрел. Для сайта, на котором есть сводная страница листинга, которая ссылается на сотни или даже тысячи отдельных страниц листинга. Я бы предпочел открывать новое окно для каждого объявления. Это позволяет пользователям сравнивать услугу / цену .... на каждой открытой странице. Кроме того, пользователю не нужно нажимать кнопку «назад», чтобы вернуться на страницу сводки и ждать, пока та же страница загрузится снова.